#php #regex #preg-match #pcre
#php #регулярное выражение #preg-совпадение #pcre
Вопрос:
У меня есть регулярное выражение, предназначенное для отслеживания телефонных номеров в строках:
[1.-][s.-]d{3}[s.-]d{3}[s.-]d{4}[s]?(.[or]?.[1.-][s.-]d{3}[s.-]d{3}[s.-]d{4}[s])?
В дополнение к перехвату стандартных телефонных номеров в строках (например. 1-222-3333
) это выражение должно соответствовать строкам типа 1-800-0000 or 1-234-5678
. Похоже, это работает так, как задумано.
Однако preg_match
функция PHP, похоже, соответствует только исходному номеру телефона, и как только она обнаруживает, что игнорирует необязательную or
часть шаблона
$matches = array();
$string = '1-208-687-4348 or 1-509-892-5779';
preg_match('/[1.-][s.-]d{3}[s.-]d{3}[s.-]d{4}[s]?(.[or]?.[1.-][s.-]d{3}[s.-]d{3}[s.-]d{4}[s])?/', $string, $matches);
print_r($matches); // matches[0] => 1-208-687-4348
В моем регулярном выражении что-то отсутствует? Должен ли я указывать порядок приоритета для группы захвата?
Комментарии:
1.
[or]?
неor
то, что естьo
, илиr
, но ни то, ни другое не требуется из-за?
. Оба числа попадают в первое совпадение, которое вы не фиксируете, используйтеpreg_match_all
, и оба числа будут в0
группе.2. Изменить
preg_match
сpreg_match_all
помощью . Кроме того, скорее всего, вам нужно исправить шаблон, скажем,[1.-][s.-]d{3}[s.-]d{3}[s.-]d{4}(s ors [1.-][s.-]d{3}[s.-]d{3}[s.-]d{4}(?!S))?