0

我有这段文字:

之前的内容

[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);

结果是:

大批
(
    [0] => 数组
        (
            [0] => [行 marginTop="10" marginBottom="10"]
            [1] => 137
        )

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

    [2] => 数组
        (
            [0] => =“10”
            [1] => 166
        )

)

为什么?我能做些什么来避免这种情况?

4

1 回答 1

2

子模式符号(...)有两个目的:分组和捕获。所以$matches最终得到所有子模式的内容,以及整个匹配。

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

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

(有关更多信息,请参阅PHP 手册中的“子模式”。)

于 2013-02-07T22:22:29.053 回答