PHP preg_match_all匹配正确,但只给出一个匹配

时间:2014-03-06 07:05:40

标签: php regex

我正在使用此正则表达式从用户提交的内容中提取部分:

preg_match_all("~\[section name=[\"|'](.*?)[\"|']\](.*?)\[\/section\]~", $content, $matches, PREG_SET_ORDER);

目的是允许非技术用户轻松创建不同的命名部分。据我所知,PHP的bbcode解析器不允许我以这种方式将内容和属性值提取到数组中。

我不确定为什么preg_match_all parsing, only one match上接受的答案被接受,因为它表明preg_match_all默认情况下不会全局匹配,并且建议的g标志似乎无效。

当前函数正确匹配,以便:

[section name="one"]this is section one[/section]

获取$matches

array (size=1)
    0 => 
        array (size=3)
            0 => string '[section name="one"]this is section one[/section]'
            1 => string 'one'
            2 => string 'this is section one'

这是理想的行为。

但是,它不会向$matches数组添加更多匹配项,只会添加第一个匹配项。

如果$matches填充了给定字符串中的所有匹配项,我需要做什么?

1 个答案:

答案 0 :(得分:1)

很奇怪,因为当我运行脚本时:

    $content = '[section name="one"]this is section one[/section]<br />[section name="two"]this is section two[/section]';
    preg_match_all("~\[section name=[\"|'](.*?)[\"|']\](.*?)\[\/section\]~", $content, $matches, PREG_SET_ORDER);
    print_r($matches);

打印:

Array
(
[0] => Array
    (
        [0] => [section name="one"]this is section one[/section]
        [1] => one
        [2] => this is section one
    )

[1] => Array
    (
        [0] => [section name="two"]this is section two[/section]
        [1] => two
        [2] => this is section two
    )

)