我有一个使用正则表达式解析字符串的函数来查找短标签。它找到第一个,但之后没有。我必须改变什么?
$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"]
答案 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
)。