我正在尝试查找字符串中的所有短代码,如下所示:
[a_col] One
[/a_col]
outside
[b_col]
Two
[/b_col] [c_col] Three [/c_col]
我需要内容(例如“三”)和col(a,b或c)中的字母 这是我正在使用的表达式
preg_match_all('#\[(a|b|c)_col\](.*)\[\/\1_col\]#m', $string, $hits);
但$ hits仅包含最后一个。
内容甚至可以包含任何字符“[”或“]”
修改
我想得到“外面”也可以是任何字符串(除了这些cols)。我该如何处理,或者我应该在第二步解析它?
答案 0 :(得分:2)
这将捕获内容中的任何内容以及属性,并允许内容中的任何字符。
<?php
$input = '[a_col some="thing"] One[/a_col]
[b_col] Two [/b_col]
[c_col] [Three] [/c_col] ';
preg_match_all('#\[(a|b|c)_col([^\[]*)\](.*?)\[\/\1_col\]#msi', $input, $matches);
print_r($matches);
?>
修改强>
您可能希望修剪匹配,因为它似乎可能有一些空格。或者,您可以使用正则表达式删除内容中的空格:
preg_match_all('#\[(a|b|c)_col([^\[]*)\]\s*(.*?)\s*\[\/\1_col\]#msi', $input, $matches);
<强>输出:强>
Array
(
[0] => Array
(
[0] => [a_col some="thing"] One[/a_col]
[1] => [b_col] Two [/b_col]
[2] => [c_col] [Three] [/c_col]
)
[1] => Array
(
[0] => a
[1] => b
[2] => c
)
[2] => Array
(
[0] => some="thing"
[1] =>
[2] =>
)
[3] => Array
(
[0] => One
[1] => Two
[2] => [Three]
)
)
使用它来捕获$matches[2]
中存储的属性名称和值也可能会有所帮助。将$atts
视为$matches[2]
中的第一个元素。当然,会迭代属性数组并在每个属性上执行此操作。
preg_match_all('#([^="\'\s]+)[\t ]*=[\t ]*("|\')(.*?)\2#', $atts, $att_matches);
这会给出一个数组,其中的名称存储在$att_matches[1]
中,其对应的值存储在$att_matches[3]
中。
答案 1 :(得分:1)
使用((.|\n)*)
代替(.*)
来捕获多行......
<?php
$string = "
[a_col] One
[/a_col]
[b_col]
Two
[/b_col] [c_col] Three [/c_col]";
preg_match_all('#\[(a|b|c)_col\]((.|\n)*)\[\/\1_col\]#m', $string, $hits);
echo "<textarea style='width:90%;height:90%;'>";
print_r($hits);
echo "</textarea>";
?>
答案 2 :(得分:0)
我没有一个我可以在这里测试的环境,但是你可以使用后面的观察并向前看断言和后面的引用来匹配内容周围的标签。这样的事情。
(?<=\[(\w)\]).*(?=\[\/\1\])