2014-12-13 3 views
0

У меня есть функция, которая анализирует строку с использованием регулярного выражения для поиска коротких тегов. Он находит первый, но потом. Что я должен изменить?Поиск нескольких экземпляров регулярного выражения

$str = blah blah [img]inner1[/img] blah [img]inner2[/img] 

function img_short($str) 
{ 
    preg_match('/\[\bimg\b\](.*?)\[\/\bimg\b\]/', $str, $match); 

    if ($match) { 
     $out = $match; 
    } else { 
     $out = $str; 
    } 
    return $out; 
} 

Мой выход представляет собой массив, содержащий только первый захват регулярок

["[img]inner1[/img]", "inner1"] 
+1

использовать 'preg_match_all', чтобы выполнить глобальное соответствие. –

ответ

1

preg_match() находит только первое вхождение. Если вы хотите найти все происшествий, вам необходимо использовать preg_match_all().

$str = 'blah blah [img]inner1[/img] blah [img]inner2[/img]'; 
$match = array(); 
preg_match_all('/\[\bimg\b\](.*?)\[\/\bimg\b\]/', $str, $match, PREG_SET_ORDER); 
print_r($match); 

Выход:

Array 
(
    [0] => Array 
     (
      [0] => [img]inner1[/img] 
      [1] => inner1 
     ) 
    [1] => Array 
     (
      [0] => [img]inner2[/img] 
      [1] => inner2 
     ) 
) 

ОБНОВЛЕНИЕ:

Как @pguardiario отмечалось, \b не нужны. Они не добавляют значения, а только усложняют регулярное выражение. Вот идет упрощена регулярное выражение:

preg_match_all('#\[img\](.*?)\[/img\]#', $str, $match, PREG_SET_ORDER); 

Я также изменил регулярок разделитель # иметь меньше символов, чтобы убежать (/ от /img).

+1

Эти '\ b' бесполезны, они ничего не делают. – pguardiario

+0

Правильно. Я не анализировал регулярное выражение, вопрос состоял в том, чтобы он соответствовал всем событиям, я сосредоточился на этом. Теперь я обновил ответ с помощью упрощенного регулярного выражения. – axiac

+0

Это лучше, но изменение разделителя не помогает, это просто усложняет чтение. – pguardiario

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