Защо следващите regex: $regex = "/b(V|E)?d{1,2}? ?d{3} ?d{3}b/i";
не съответства на всички входни данни по-долу
Наистина мисля, че това (V|E)?d{1,2}? ?
биха направили по избор буквите, първото едно или две номера и първото пространство
<?php
$sms = array(
"test test test 11 111 111 test test test",
"test test test 1 111 111 test test test",
"test test test 111 111 test test test", // does not match
"test test test test test test 11111111",
"test test test 1111111 test test test",
"test test test 111111 test test test", // does not match
"test test test E11 111 111 test test test",
"test test test V1 111 111 test test test",
"test test test V111 111 test test test", // does not match
"test test test V11111111 test test test",
"test test test V1111111 test test test",
"test test test E111111 test test test", // does not match
"test test test V 11 111 111 test test test",
"test test test V 1 111 111 test test test",
"test test test E 111 111 test test test", // does not match
"test test test V 11111111 test test test",
"test test test V 1111111 test test test",
"test test test V 111111 test test test", //does not match
"test test test V11 111 111 test test test",
"test test test V1 111 111 test test test",
"test test test E111 111 test test test", //does not match
"test test test V11111111 test test test",
"V1111111 test test test test test test",
"test test test V111111 test test test", // does not match
);
$regex = "/b(V|E)?d{1,2}? ?d{3} ?d{3}b/i";
$noMatches = 0;
$index = 0;
foreach($sms as $v) {
$match = preg_match($regex, $v, $matches);
if($match) {
//print_r($matches);
//echo "$v match!n";
//$matches++;
}
else {
echo "$index - $v does NOT match!n";
$noMatches++;
}
$index++;
}
$total = count($sms);
echo "nnTotal: $totalnNo Matches: $noMatchesn";
OUTPUT
$ php test-regex.php
2 - test test test 111 111 test test test does NOT match!
5 - test test test 111111 test test test does NOT match!
8 - test test test V111 111 test test test does NOT match!
11 - test test test E111111 test test test does NOT match!
14 - test test test E 111 111 test test test does NOT match!
17 - test test test V 111111 test test test does NOT match!
20 - test test test E111 111 test test test does NOT match!
23 - test test test V111111 test test test does NOT match!
Total: 24
No Matches: 8
РЕДАКТИРАНЕ:
Използването на предложението на Марио сега е регекс $regex = "/b(V|E)?d{0,2} ?d{3} ?d{3}b/i";
, защо в някои случаи това изречение не обхваща писмото V
или E
$output = array(
"test test test E11 111 111 test test test" => "E11 111 111",
"test test test V1 111 111 test test test" => "V1 111 111",
"test test test V111 111 test test test" => "V111 111",
"test test test V11111111 test test test" => "V11111111",
"test test test V1111111 test test test" => "V1111111",
"test test test E111111 test test test" => "E111111",
"test test test V 11 111 111 test test test" => "11 111 111", // Missing Letter
"test test test V 1 111 111 test test test" => "1 111 111", // Missing Leter
"test test test E 111 111 test test test" => "E 111 111",
"test test test V 11111111 test test test" => "11111111", // Missing Letter
"test test test V 1111111 test test test" => "1111111", // Missing Letter
"test test test V 111111 test test test" => "V 111111",
"test test test V11 111 111 test test test" => "V11 111 111",
"test test test V1 111 111 test test test" => "V1 111 111",
"test test test E111 111 test test test" => "E111 111",
"test test test V11111111 test test test" => "V11111111",
"V1111111 test test test test test test" => "V1111111",
"test test test V111111 test test test" => "V111111",
"V 1111111 test test test" => "1111111", // Missing Letter
"test test test V 1111111 test test test" => "1111111", // Missing Letter
);
Отговори:
2 за отговор № 1?
само е квантификатор след групи или буквални символи или класове символи, напр.
ако ?
се появява след друг квантор *
или +
и {n,m}
това просто ще направи съвпадението по-малко алчно. Това означава, че regex ще се опита да намери най-ниската сума.
Така d{1,2}?
не означава незадължително. Това означава съвпадение на една или две, но предпочитат да съвпадат само с едно. Искаш да пишеш d{0,2}
вместо.
1 за отговор № 2
Те не съвпадат, защото регулярният израз изисква най-малко 7 цифри:
/b(V|E)?d{1,2}? ?d{3} ?d{3}b/
| | |
| | --------> 3 digits exactly
| ---------------> 3 digits exactly
------------------------> 1 or 2 digits (prefers 1, but will match
2 if there are 8 digits in a row)
Всички отказали входове са с една цифра.
1 за отговор № 3
Ако искате да направите изцяло първата част, трябва да я поставите в скоби и да добавите a ?
към това. Можете също да използвате група символи за V|E
(?:[VE]d{1,2} )?