Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 对正则表达式没有什么帮助_Php_Regex_Split - Fatal编程技术网

Php 对正则表达式没有什么帮助

Php 对正则表达式没有什么帮助,php,regex,split,Php,Regex,Split,我如何匹配这些: (1, 'asd', 'asd2') 但与此不符: (1, '(data)', 0) 我想匹配(和),但不匹配(和)内部(和) 实际上,这些都是查询,我想通过preg_split对它们进行拆分 /[\(*\)]+/ 拆分它们,但也拆分(和)它们内部,如何修复此问题 例如: 数据如下: (1,'user1',1,0,0,0)(2,'user(2)'1,0,0,1) 我想将它们拆分为: Array( 0 => (1, 'user1', 1, 0, 0, 0)

我如何匹配这些:

(1, 'asd', 'asd2')
但与此不符:

(1, '(data)', 0)
我想匹配(和),但不匹配(和)内部(和)

实际上,这些都是查询,我想通过preg_split对它们进行拆分

/[\(*\)]+/
拆分它们,但也拆分(和)它们内部,如何修复此问题

例如:

数据如下:

(1,'user1',1,0,0,0)(2,'user(2)'1,0,0,1)

我想将它们拆分为:

Array(
    0 => (1, 'user1', 1, 0, 0, 0)
    1 => (2, 'user(2)', 1, 0, 0, 1)
);
与其相反,其拆分为:

Array(
    0 => (1, 'user1', 1, 0, 0, 0)
    1 => (2, 'user
    2 => 2
    3 => ', 1, 0, 0, 1)
);

这方面的正则表达式有点恶心。相反,您可以迭代整个字符串并决定拆分位置:

  • 如果它是一个
    ,则在那里拆分。(我假设括号在字符串中是平衡的,不能嵌套)
  • 如果是
    ,则忽略任何
    ,直到结束
    (如果可以转义,则可以查看前面的字符以查找奇数的
    \

我认为这是一个比正则表达式更直接的解决方案。

您不能为此使用
preg\u split
(因为您不匹配边框,而是更长的模式)。但是,使用
preg\u match\u all
,这是可能的:

 preg_match_all(':\( ((?R) | .)*? \):x', $source, $matches);
 print_r($matches[0]);
除了递归版本之外,您还可以只为单个级别的内部括号准备模式。但事实上,这看起来并不简单

 :\( ( [^()]* | \( [^()]* \) )+ \):x

你的语法似乎是错误的

list:  '(' num ( ',' term )(s?) ')'
term:  num | str
num:   /[0-9]+/
str:   /'[^']*'/
所以模式是

/ \G \s* \( \s* [0-9]+ (?: \s* , \s* (?: [0-9]+ | '[^']*' ) )* \s* \) /x
嗯,那只是为了匹配。如果PHP的工作方式与Perl类似,那么提取就是一个难题。如果你想使用正则表达式匹配,你必须分两次使用

首先提取列表:

/ \G \s* \( \s* ( [0-9]+ (?: \s* , \s* (?: [0-9]+ | '[^']*' ) )* ) \s* \) /x
/ \G \s* ( [0-9]+ | '[^']*' ) (?: \s* , )? /x
然后从列表中提取术语:

/ \G \s* \( \s* ( [0-9]+ (?: \s* , \s* (?: [0-9]+ | '[^']*' ) )* ) \s* \) /x
/ \G \s* ( [0-9]+ | '[^']*' ) (?: \s* , )? /x

请您澄清一下这两个示例的输出是什么?严格来说,这不是正则表达式,您必须使用一些正则表达式引擎的递归扩展。您确定需要/[(*)]+/而不是/[(.*)]+/@Layke,这样不行。如果我添加。由于[]的原因,它搜索(.ANY)而不是(ANY)。但是如果我删除[]的代码,代码就不起作用了。@Alex Emilov,谢谢你的澄清!:-)我发现这项任务不太适合preg_split,因为必须计算开始括号和结束括号。也许去做一些提到的事情。这很有效。你能简要描述一下你的模式是如何运作的吗?我对正则表达式中的递归性不太熟悉。@poplitea实际上非常简单:
(?R)
匹配整个正则表达式本身。这就是我要知道的一切。把它用得好需要一些练习though@Gabi谢谢你,很高兴知道!我不怀疑,递归性总是需要敏锐的头脑/一些练习…:-)@poplitea:这更像是一点耐心和反复试验:}手册页解释了它背后的语法。但是最好考虑一下抽象的情况,您只需将整个正则表达式的另一个级别放入
?R
位置。