2013-03-06 3 views
0

Я пытаюсь найти все совпадения в строке. По какой-то причине, если мое совпадение находится в начале строки, оно не возвращает этого конкретного совпадения. Связано ли это с индексом 0? Я также использую PREG_OFFSET_CAPTURE для получения индексов против совпадений. Ниже приведен код работы нерабочего.PHP preg_match_all не находит первое совпадение

$text = '[QUOTE]I wonder why[QUOTE]PHP[IMG]hates me[/IMG][/QUOTE][/QUOTE][URL="http://www.bing.com"]Click me![QUOTE]........[/QUOTE]Ok Bai![/URL]'; 
preg_match_all('#\[QUOTE\]#', $text, $matches, PREG_OFFSET_CAPTURE, PREG_PATTERN_ORDER); 
print_r($matches); 

Результатом которого является:

Array ([0] => Array ([0] => Array ([0] => [QUOTE] [1] => 19) [1 ] => Массив ([0] => [QUOTE] [1] => 100)))

Как видите, он встречается только в двух матчах. Если я добавлю символ в начало строки, он найдет все три.

$text = 'a[QUOTE]I wonder why[QUOTE]PHP[IMG]hates me[/IMG][/QUOTE][/QUOTE][URL="http://www.bing.com"]Click me![QUOTE]........[/QUOTE]Ok Bai![/URL]'; 
preg_match_all('#\[QUOTE\]#', $text, $matches, PREG_OFFSET_CAPTURE, PREG_PATTERN_ORDER); 
print_r($matches); 

Результатом которого является:

Array ([0] => Array ([0] => Array ([0] => [QUOTE] [1] => 1) [1 ] => Массив ([0] => [QUOTE] [1] => 20) [2] => Массив ([0] => [QUOTE] [1] => 101)))

Все три Матчи. Если кто-нибудь может помочь мне выяснить, должен ли меня изменить REGEX или если есть какая-то причуда, о которой я не знаю, это было бы очень признательно. Я пробовал это же, используя Python и re library, и он возвращает все мои матчи. Я также использовал этот http://www.regextester.com/, и он сообщает, что он работает в обоих сценариях и соответствует всем, как должен. Моя единственная догадка связана с тем, что PREG_OFFSET_CAPTURE находит совпадение в позиции 0 и 0 вызывает некоторую проблему.

Заранее благодарим за любую помощь!

ответ

3

Правильный способ добавить несколько флагов с трубкой |, так:

preg_match_all('#\[QUOTE\]#', $text, $matches, PREG_OFFSET_CAPTURE | PREG_PATTERN_ORDER); 

Ваш , перед тем PREG_PATTERN_ORDER означает, что он становится параметр «смещение» (в этот момент в строке для начала), и как PREG_PATTERN_ORDER == 1, он начинается со второго символа.

+0

+1 Лучше, чем мое ... – jeroen

+0

Вы - святой Wrikken, если бы был способ опрокинуть вас, я бы сделал это: D – Skylude

0

Проблема заключается в вашем function call:

preg_match_all('#\[QUOTE\]#', $text, $matches, PREG_OFFSET_CAPTURE, PREG_PATTERN_ORDER); 

Пятый параметр является смещением, а не другой флаг.

Смежные вопросы