Как получить позицию соответствия регулярного выражения в строке?
Я знаю, как использовать preg_match и preg_match_all для поиска фактических совпадений шаблонов регулярных выражений в заданной строке, но функция, которую я пишу, нуждается не только в тексте совпадений, но и в том, чтобы пересекать строку AROUND спички...
Поэтому мне нужно знать положение совпадения в строке, на основе шаблона регулярного выражения.
Я не могу найти функцию, похожую на strpos(), которая позволяет regex... любые идеи?
Ответы
Ответ 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.