将此值拆分为插入查询的一部分

时间:2014-10-20 11:28:53

标签: php regex

有没有办法达到以下目的?我需要接受这个$查询并将其拆分为各种元素(原因是因为我不得不重新处理插入查询)。正如您所看到的,这将适用于常规字符串块或数字,但不适用于字符串中出现数字的位置。有没有办法说| \ 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'.

**另外我不介意每个字符串引用 - 我可以自己重新引用它们。

5 个答案:

答案 0 :(得分:4)

(*SKIP)(*F)个单引号内的部分可以与,匹配:

'(?:\\'|[^'])*'(*SKIP)(*F)|,

(?:\\'|[^'])单引号内部匹配转义\'或不是单引号的字符。

See Test at regex101.com

$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)

('(?:(?!(?<!\\)').)*')|(\d+)

试试这个。抓住captures.Each字符串也被引用。参见演示。

http://regex101.com/r/dK1xR4/3

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

,(?=(?:[^']*'[^']*')*[^']*$)

试试这个。这将根据你的需要进行拆分。按\n进行拆分。见演示。

http://regex101.com/r/dK1xR4/4