查找正则表达式的多个实例

时间:2014-12-13 14:47:15

标签: php regex

我有一个使用正则表达式解析字符串的函数来查找短标签。它找到第一个,但之后没有。我必须改变什么?

$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 个答案:

答案 0 :(得分: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)。