我试着寻找答案,但在这种情况下我找不到任何有用的东西。我可能没有找到正确的条款。
我在使用这个正则表达式时遇到了麻烦。考虑一下这个字符串:
$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
)
)
它自然会截断数据。我该怎么做才能忽略引号中的括号?如果我可以忽略它们,那么当我分开这些匹配的下一步时,我将能够忽略逗号。
谢谢!
答案 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)')
)
)