Regexp问题,多个匹配,但为什么?

时间:2013-02-07 22:17:07

标签: php regex preg-match

我有这样的文字:

之前的内容

[row marginTop="10" marginBottom="10"]

[column_3]

[column][article id="12" /][/column]

[column][article id="13" /][/column]

[column][article id="14" /][/column]

[/column_3]

[/row]

当我这样做时:

$pattern = '/^(\[([a-zA-Z0-9][a-zA-Z0-9_]+[a-zA-Z0-9]) *( [a-zA-Z]+(="[^".]*")?)*( *\/)?\])$/';
preg_match($pattern, $text, $matches, PREG_OFFSET_CAPTURE);

print_r($matches);

结果是:

Array
(
    [0] => Array
        (
            [0] => [row marginTop="10" marginBottom="10"]
            [1] => 137
        )

    [1] => Array
        (
            [0] =>  marginBottom="10"
            [1] => 156
        )

    [2] => Array
        (
            [0] => ="10"
            [1] => 166
        )

)

为什么呢?我该怎么做才能避免这种情况?

1 个答案:

答案 0 :(得分:2)

子模式符号(...)有两个用途:分组和捕获。因此,$matches会以所有子模式的内容以及整个匹配结束。

如果您不想这样,可以删除不需要分组的括号,如果需要分组而不进行分组,则可以使用非捕获子模式表示法(?:...)

$pattern = '/^\[[a-zA-Z0-9][a-zA-Z0-9_]+[a-zA-Z0-9] *(?: [a-zA-Z]+(?:="[^".]*")?)*(?: *\/)?\]$/';

(有关详细信息,请参阅"Subpatterns" in the PHP Manual。)