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

Php 将此值拆分为插入查询的一部分,php,regex,Php,Regex,有没有办法实现以下目标?我需要接受这个$query并将其拆分为不同的元素,原因是我必须重新处理一个insert查询。如您所见,这适用于常规字符串块或数字,但不适用于字符串中出现数字的位置。有没有一种方法可以说|\d,但在“带引号的字符串”中不可以说|\d $query = "('this is\'nt very, funny (I dont think)','is it',12345,'nope','like with 2,4,6')"; $matches = preg_split("#',|

有没有办法实现以下目标?我需要接受这个$query并将其拆分为不同的元素,原因是我必须重新处理一个insert查询。如您所见,这适用于常规字符串块或数字,但不适用于字符串中出现数字的位置。有没有一种方法可以说|\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>';
**此外,我不介意每个字符串都没有被引用——我可以自己重新引用它们

'(?:\\'|[^'])*'(*SKIP)(*F)|,
试试这个。抓取捕获。每个字符串也被引用。参见演示

试试这个。抓取捕获。每个字符串也被引用。参见演示

可以在单引号内和外部匹配的部件:

?单引号内的“\\'\[^']匹配转义\”或非单引号的字符

在eval.in.进行试验

<?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]);
?>
不完全确定,如果这是您的意思:

可以在单引号内和匹配的部分之外:

?单引号内的“\\'\[^']匹配转义\”或非单引号的字符

在eval.in.进行试验

<?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]);
?>

不完全确定,如果这是您的意思:

您可以尝试通过preg\u match\u all进行匹配,而不是拆分

Array
(
    [0] => 'this is\'nt very, funny (I dont think)'
    [1] => 'is it'
    [2] => 12345
    [3] => 'nope'
    [4] => 'like with 2,4,6'
)

您可以尝试通过preg_match_all进行匹配,而不是拆分

Array
(
    [0] => 'this is\'nt very, funny (I dont think)'
    [1] => 'is it'
    [2] => 12345
    [3] => 'nope'
    [4] => 'like with 2,4,6'
)
如果您不介意使用preg_match,那么解决方案可能如下所示。此正则表达式使用带否定断言的lookbehind?,它将匹配引号内不带斜杠的字符串,并且使用竖线的交替方式确保将忽略作为较大匹配的一部分的数字

,(?=(?:[^']*'[^']*')*[^']*$)
如果您不介意使用preg_match,那么解决方案可能如下所示。此正则表达式使用带否定断言的lookbehind?,它将匹配引号内不带斜杠的字符串,并且使用竖线的交替方式确保将忽略作为较大匹配的一部分的数字

,(?=(?:[^']*'[^']*')*[^']*$)
尝试此操作。此操作将根据需要进行拆分。替换为\n。请参阅演示

尝试此操作。此操作将根据需要进行拆分。替换为\n。请参阅演示


提供预期的输出$matches.$matches将在每个字段/值处分开,而不是在字符串中找到逗号。因此,在上拆分,但不是每个。如果提供输出,用户可以尝试验证他们对文本描述的理解是否正确。没有人喜欢模糊的描述。创建好的示例,展示角落案例的行为。@Ukuser32在您的问题中发布预期的输出。请参阅我的回答。我希望以下每一项都是数组中的值:0:“我不认为这很有趣”,1:“是”,2:12345,3:“不是”,4:“与2,4,6类似”。希望有帮助。提供预期的输出$matches。$matches将在每个字段/值处分开,而不是在字符串中找到逗号。因此,在上拆分,但不是每个。如果提供输出,用户可以尝试验证他们对文本描述的理解是否正确。没有人喜欢模糊的描述。创建好的示例,展示角落案例的行为。@Ukuser32在您的问题中发布预期的输出。请参阅我的回答。我希望以下每一项都是数组中的值:0:“我不认为这很有趣”,1:“是”,2:12345,3:“不是”,4:“与2,4,6类似”。希望能有帮助。不幸的是,preg_split’?:?!?您将如何在php中实现这一点?因为我也有一个正则表达式,但它在执行正则表达式和代码时失败。@Ukuser32使用preg\u match\u all,然后抓取组。不需要使用m-flag\u-split'?:?!?您将如何在php中实现这一点?因为我也有一个正则表达式,但它在执行正则表达式和代码时失败。@Ukuser32使用preg\u match\u all,然后抓取组。不需要旗杆我想这就是OP想要的:那是我想要的100%。谢谢,我不认为我会在一百万年内到达那里,也许是几百年!!我想这就是OP想要的:这就是我想要的。谢谢,我不认为我会在一百万年内到达那里,也许是几百年!!
$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
        )

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