Подтвердить что ты не робот

Как получить позицию соответствия регулярного выражения в строке?

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

Поэтому мне нужно знать положение совпадения в строке, на основе шаблона регулярного выражения.

Я не могу найти функцию, похожую на strpos(), которая позволяет regex... любые идеи?

4b9b3361

Ответ 1

Для этого вы можете использовать флаг PREG_OFFSET_CAPTURE :

preg_match('/bar/', 'Foobar', $matches, PREG_OFFSET_CAPTURE);
var_export($matches);

Результат:

array (
  0 => 
  array (
    0 => 'bar',
    1 => 3,     // <-- the string offset of the match
  ),
)

В предыдущей версии этот ответ включал группу захвата в регулярное выражение (preg_match('/(bar)/', ...)). Как видно из первых нескольких комментариев, это смутило некоторых и с тех пор было отредактировано @Mikkel. Пожалуйста, игнорируйте эти комментарии.

Ответ 2

preg_match имеет необязательный флаг PREG_OFFSET_CAPTURE, который записывает позицию строки вхождения совпадения в исходном "стоге сена". Смотрите раздел "флаги": http://php.net/preg_match

Ответ 3

С помощью PREG_OFFSET_CAPTURE на preg_match() вы получите количество совпадений по шаблону. Когда есть совпадение, это будет иметь значение смещения, которое начинается с 0.

Используя это значение, вы можете снова вызвать preg_match, используя параметр offset.