我有这样的文字:
之前的内容
[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 ) )
为什么呢?我该怎么做才能避免这种情况?
答案 0 :(得分:2)
子模式符号(...)
有两个用途:分组和捕获。因此,$matches
会以所有子模式的内容以及整个匹配结束。
如果您不想这样,可以删除不需要分组的括号,如果需要分组而不进行分组,则可以使用非捕获子模式表示法(?:...)
:
$pattern = '/^\[[a-zA-Z0-9][a-zA-Z0-9_]+[a-zA-Z0-9] *(?: [a-zA-Z]+(?:="[^".]*")?)*(?: *\/)?\]$/';
(有关详细信息,请参阅"Subpatterns" in the PHP Manual。)