正则表达式 - 忽略引号中的某些字符

时间:2010-10-03 20:18:45

标签: regex character ignore

我试着寻找答案,但在这种情况下我找不到任何有用的东西。我可能没有找到正确的条款。

我在使用这个正则表达式时遇到了麻烦。考虑一下这个字符串:

$str = "(1, 2, 'test (foo) bar'), (3, 4, '(hello,world)')";

我希望最终得到一个多维数组,如下所示:

$arr = array(
   array(1, 2, 'test (foo) bar'),
   array(3, 4, '(hello,world)')
);

我想我可以运行一个正则表达式将它分成单独的字符串,如“(1,2,'test(foo)bar')”和“(3,4,'(hello,world)')”,和然后运行一个正则表达式的每一个用逗号分割,但正如你可以看到我的问题是数据有各种字符串括号和逗号,我想忽略这些。

到目前为止,我有这个,它的第一部分就像我想要的那样,除非数据中有括号,然后它就会中断。

preg_match_all('/\((.*?)\),?/', $str, $matches);

它给了我这个:

Array
(
    [0] => Array
        (
            [0] => (1, 2, 'test (foo)
            [1] => (3, 4, '(hello,world)
        )

    [1] => Array
        (
            [0] => 1, 2, 'test (foo
            [1] => 3, 4, '(hello,world
        )

)

它自然会截断数据。我该怎么做才能忽略引号中的括号?如果我可以忽略它们,那么当我分开这些匹配的下一步时,我将能够忽略逗号。

谢谢!

3 个答案:

答案 0 :(得分:0)

一般情况下,你不能用正则表达式做到这一点。但在这种情况下,你可以尝试这个表达式:

\(([^']*?'.*?')\),?

答案 1 :(得分:0)

([0-9]+), (\'([A-Za-z0-9(), ]+)\')?

这似乎可以做你想要的。

$matches Array:
(
[0] => Array
    (
        [0] => 1, 
        [1] => 2, 'test (foo) bar'
        [2] => 3, 
        [3] => 4, '(hello,world)'
    )

[1] => Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
        [3] => 4
    )

[2] => Array
    (
        [0] => 
        [1] => 'test (foo) bar'
        [2] => 
        [3] => '(hello,world)'
    )

[3] => Array
    (
        [0] => 
        [1] => test (foo) bar
        [2] => 
        [3] => (hello,world)
    )
)

这更接近吗?

答案 2 :(得分:0)

尝试这种模式:

$pattern = '/((?:.*?),(?:.*?),(?:.*?)),(.*)/';

这有输出

Array
(
    [0] => Array
        (
            [0] => (1, 2, 'test (foo) bar'), (3, 4, '(hello,world)')
        )

    [1] => Array
        (
            [0] => (1, 2, 'test (foo) bar')
        )

    [2] => Array
        (
            [0] =>  (3, 4, '(hello,world)')
        )

)