我想从字符串中提取这个括号中的部分:
[list items='["one","two"]' ok="no" b="c"]
我正在使用以下preg_match
电话:
preg_match('~\[([a-zA-Z0-9_]+)[ ]+([a-zA-Z0-9]+=[^\[]+)\]~s', $string,$match)
但我在引号内出现的括号有问题。
我有两个文件
[list items=""one","[x]tw"'o"" ok="no" b="c""/]
@book
[button text="t'"extB1" name="ok"'" /]
Asdfz " s wr aw3r '
[button text="t"'extB2" name="no"'" /]
$string=file_get_contents('theme.html');
for (;;) {
if (!preg_match('~\[([a-zA-Z0-9_]+)[ ]+([a-zA-Z0-9]+=[^\[]+)\]~s', $string,$match)) {
exit;
}
$string=str_replace($match[0], '', $string);
echo "<pre><br>";
print_r($match);
echo "<br></pre>";
}
这是输出:
<pre><br>Array
(
[0] = [button text="textB1" name="ok"]
[1] = button
[2] = text="textB1" name="ok"
)
<br></pre>
<pre><br>Array
(
[0] = [button text="textB2" name="no"]
[1] = button
[2] = text="textB2" name="no"
)
<br></pre>
如您所见,输出不包括
[list items='["one","two"]' ok="no" b="c"]
我知道问题是由嵌入的方括号引起的,但我不知道如何纠正代码以忽略它们。
答案 0 :(得分:0)
您可以使用*.java
来电的这种变体:
preg_match
使用if (!preg_match('~\[(\w+)\s+(\w+=(?:\'[^\']*\'|[^\[])+?)\]~s', $string, $match))
,它会检测到报价的存在,并会抓住所有字符,直到下一个报价,而不会在开括号上阻塞。只有当它无法匹配时,它才能用于您拥有的部分:\'[^\']*\'
。我为此添加了[^\[])+
,以使其非贪婪,这可确保它不会获得结束?
。
另请注意,]
可以缩短为[a-zA-Z_]
,而\w
可以写为[ ]
,这也会允许其他空白区域,我相信可以
在eval.in上看到它。
如果引号可以出现在任何地方而不保证结束括号出现在引号内,那么上述内容将无效。
相反,我们可能要求匹配必须跨越文本中的完整一行:
\s
在eval.in上看到它。