有没有办法达到以下目的?我需要接受这个$查询并将其拆分为各种元素(原因是因为我不得不重新处理插入查询)。正如您所看到的,这将适用于常规字符串块或数字,但不适用于字符串中出现数字的位置。有没有办法说| \ d而不是“引用字符串”中出现\ d的位置?
$query = "('this is\'nt very, funny (I dont think)','is it',12345,'nope','like with 2,4,6')";
$matches = preg_split("#',|\d,#",substr($query,1,-1));
echo $query;
print'<pre>[';print_r($matches);print']</pre>';
所以只是为了清楚预期的结果:
0:'this is\'nt very, funny (I dont think)'
1:'it is'
2:12345
3:'nope'
4:'like with 2,4,6'.
**另外我不介意每个字符串不引用 - 我可以自己重新引用它们。
答案 0 :(得分:4)
(*SKIP)(*F)个单引号内的部分可以与,
匹配:
'(?:\\'|[^'])*'(*SKIP)(*F)|,
(?:\\'|[^'])
单引号内部匹配转义\'
或不是单引号的字符。
$query = "('this is\'nt very, funny (I dont think)','is it',12345,'nope','like with 2,4,6')";
$matches = preg_split("~'(?:\\\\'|[^'])*'(*SKIP)(*F)|,~", substr($query,1,-1));
print_r($matches);
outputs to(在eval.in测试)
Array
(
[0] => 'this is\'nt very, funny (I dont think)'
[1] => 'is it'
[2] => 12345
[3] => 'nope'
[4] => 'like with 2,4,6'
)
不完全确定,如果这就是你的意思:)
答案 1 :(得分:1)
答案 2 :(得分:1)
您可以尝试通过preg_match_all
进行匹配,而不是分割。
<?php
$data = "('this is\'nt very, funny (I dont think)','is it',12345,'nope','like with 2,4,6')";
$regex = "~'(?:\\\\'|[^'])+'|(?<=,|\()[^',)]*(?=,|\))~";
preg_match_all($regex, $data, $matches);
print_r($matches[0]);
?>
<强>输出:强>
Array
(
[0] => 'this is\'nt very, funny (I dont think)'
[1] => 'is it'
[2] => 12345
[3] => 'nope'
[4] => 'like with 2,4,6'
)
答案 3 :(得分:0)
如果您不介意使用preg_match
,那么解决方案可能如下所示。此正则表达式使用带有负断言(?<!\\\\)
的lookbehind,它将匹配不带斜杠的引号内的字符串,并且与竖线的交替确保将忽略属于较大匹配的数字。
$query = "('this is\'nt very, funny (I dont think)','is it',12345,'nope','like with 2,4,6',6789)";
preg_match_all( "/(?<!\\\\)\'.+?(?<!\\\\)\'|\d+/", substr( $query, 1, -1 ), $matches );
print_r( $matches );
/* output:
Array (
[0] => Array
(
[0] => 'this is\'nt very, funny (I dont think)'
[1] => 'is it'
[2] => 12345
[3] => 'nope'
[4] => 'like with 2,4,6'
[5] => 6789
)
)
*/
答案 4 :(得分:0)