因为有用性/硬度,我喜欢/讨厌正则表达式。 (我不是为什么,但我不能构建模式:()
我的数据库字段中有一些记录,如此
[(ip1=192.x.?.100)(id1=125485smds65)(date1=11.02.2011-15:00/15.06.2012-17:30)(text1=Some text that can include all brackets and/or parentheses & any chars etc, like < ( text . } , [ any ) ] { etc.**)][(ip2=x.x.20.?)(num2=1235845)(text2=many other words :))]...
好的,我想返回一个包含值的数组;
$result[ip1] = 192.x.?.100;
$result[id1] = 125485smds65;
$result[date1] = 11.02.2011-15:00/15.06.2012-17:30;
$result[text1] = Some text that can include all brackets and/or parentheses & any chars etc, like < ( text . } , [ any ) ] { etc.**;
$result[ip2] = 192.x.?.100;
$result[num2] = 1235845;
$result[text2] = many other words :)
您可以看到,括号和括号中的数据数量可能会有所不同
那么,preg_match_all正则表达式收集上述数据的真实模式是什么?
答案 0 :(得分:4)
尝试这样的事情:
$s = '(ip1=192.x.?.100)(id1=125485smds65)(date1=11.02.2011-15:00/15.06.2012-17:30)
(text1=Some text that can include all brackets and/or paranthesis & any chars etc,
like < ( text . } , [ any ) ] { etc.**)][(ip2=x.x.20.?)(num2=1235845)
(text2=many other words :))';
preg_match_all('/\((?:[^()]|(?R))*\)/', $s, $matches);
print_r($matches);
将打印:
Array
(
[0] => Array
(
[0] => (ip1=192.x.?.100)
[1] => (id1=125485smds65)
[2] => (date1=11.02.2011-15:00/15.06.2012-17:30)
[3] => (text1=Some text that can include all brackets and/or paranthesis & any chars etc,
like < ( text . } , [ any ) ] { etc.**)
[4] => (ip2=x.x.20.?)
[5] => (num2=1235845)
[6] => (text2=many other words :)
)
)
正则表达式模式(?R)
中的/\((?:[^()]|(?R))*\)/
是对整个模式迭代的递归调用。
从您的问题下面的评论中可以清楚地看出:不建议在生产代码中使用此类regex-voodoo。我的建议是不存储您的数据,就像您在数据库中一样。请从根本解决问题!
答案 1 :(得分:0)
你可以这样做:
/(\(([^)=]*)=([^)]*)\))*/
然而,这是不可能的“一些文本可以包括所有括号和/或paranthesis” - 世界上你如何区分文本与右括号?
如果这是一个非常糟糕的数据结构。首先,它是一个数据库 - 它有列,使用它们!第二,为什么要滚动自己的数据结构?你可以使用json或php的serialize()
。
正则表达式是这项工作的错误工具。