真正的正则表达式,用于从括号中的括号中获取内容

时间:2011-11-10 22:00:43

标签: php arrays regex brackets

因为有用性/硬度,我喜欢/讨厌正则表达式。 (我不是为什么,但我不能构建模式:()
我的数据库字段中有一些记录,如此

[(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正则表达式收集上述数据的真实模式是什么?

2 个答案:

答案 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()

正则表达式是这项工作的错误工具。