порядок приоритета pcre в группе захвата?

#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))?