Как я могу получить все вхождения этого шаблона с регулярным выражением PHP? - PullRequest
0 голосов
/ 17 мая 2018

Как я могу получить в массив все вхождения этого шаблона 4321 [5-9] [7-9] {6}, но исключая, например, вхождения, где непосредственно перед значением стоит цифра, или сразу после него?

Например, 43217999999 должен быть действительным, но 1 43217999999 (обратите внимание на номер 1 в начале) не должен быть действительным.

Как первый пример, 43217999999 1 не должен быть действительным из-за 1 , который он имеет в конце.

Дополнительная трудность, по крайней мере для меня, заключается в том, что я должен анализировать это в любой позиции, в которой я могу найти его внутри строки.

Строка выглядит буквально так:

43217999997 / 5 43217999999 // 43217999998 _ 43217999999a43216999999-43216999999 arandomword 43215999999 7

Как вы могли заметить, у него нет стандартного способа разделения значений (я выделил жирным шрифтом значения, которые делали бы его недействительным, поэтому я не должен совпадать с ними)

Моя идея сейчас примерно такая:

(\D+|^)(4321[5-9][7-9]{6})(\D+|$)

(\ D + | ^) означает, что я ожидаю в этой позиции начала строки или хотя бы одного нецифрового числа и (\ D + | $) означает, что я ожидаю конца строки или хотя бы одного незначного -значное.

Это явно не соответствует тому, что я себе представляю.

Я тоже пытался сделать это в два шага, первый:

preg_match_all("/\D+4321[5-9][7-9]{6}\D+|4321[5-9][7-9]{6}\D+|4321[5-9][7-9]{6}$/", $input, $outputArray);

и затем:

for($cont = 0; $cont < count($outputArray); $cont++) {
   preg_match("/4321[5-9][7-9]{6}/", $outputArray[0][$cont], $outputArray2[]);
}

чтобы я мог напечатать

<code>echo "<pre>" . print_r($outputArray2, true) . "
";

, но это не позволяет мне исключить те, у которых есть число до начала значения (например, 5 432157999999), а затем я не добиваюсь прогресса в своей идее.

Заранее спасибо за любую помощь.

1 Ответ

0 голосов
/ 17 мая 2018

Если вы буквально хотите проверить, нет ли цифры до или после матча, вы можете использовать отрицательный взгляд вперед и назад.

  • (?![0-9]) в конце означает: «не следует 0-9»
  • (?<![0-9]) в начале означает: "не предшествует 0-9"

См. Этот пример https://regex101.com/r/6xbmJk/1

...