PHP regex语法问题:非捕获类中的斜杠

时间:2019-03-21 15:44:35

标签: php regex syntax preg-match-all

我发现两个不同的正则表达式在Regex101中进行测试时可以正常工作,但是在PHP中使用它们时会失败。

我正在尝试提取一个引用的子字符串,该子字符串中的引号已转义。解决方案在堆栈溢出中无处不在。我不是在寻找解决方案,因为我发现有两个可以在Regex101中工作,但不能在PHP中工作。我在PHP中遇到了语法问题,这就是我要确定的问题。

对于以下字符串:

  

“ aaaaa”:{“ bbbb”:[{“ cccc”:{“ BINGO”:“ \”无猫,\“丙烯酸,24 \” x30 \“。   文字显示为“ \“掷骰子是什么?#Wow”}}]},“ dddd”:“ eeee”

...我正在尝试: 1)找到“ BINGO”: 2)找到所有在其后面的所有引号都被转义的文本 3)找到未转义的“”结束

作为三个捕获组,返回将是:

1)“ BINGO”:“ 2)\“没有猫,\”丙烯酸,24 \“ x30 \”。文字上写着:“什么掷骰子?#哇 3)“

在Regex101中可用于此目的的正则表达式为:/("BINGO":")([^"\\]*(?:\\.[^"\\]*)*)(")/

在PHP中,我尝试过这样编码:

$source = '"aaaaa":{"bbbb":[{"cccc":{"BINGO":"\"No Cats,\" acrylic, 24\"x30\". the text reads, \"What rolls the dice? #Wow"}}]},"dddd":"eeee",';
$matches = [];
preg_match_all('/("BINGO":")([^"\\]*(?:\\.[^"\\]*)*)(")/i', $source, $matches);
print_r('<pre>');
print_r($matches);

但是这失败了,我得到以下PHP警告:

  

PHP警告:preg_match_all():编译失败:丢失   在第4行的偏移量34处终止]用于字符类

我尝试使用另一种也可以在Regex101中使用的正则表达式:/("BINGO":")(.*)((?<!\\)")/i

我将其放入相同的preg_match_all函数中:

preg_match_all('/("BINGO":")(.*)((?<!\\)")/i', $source, $matches);

但这也失败了,我得到以下警告消息:

  

PHP警告:preg_match_all():编译失败:缺少关闭   括号在第7行的偏移23处

似乎在类分组[]中将斜杠解释为文字。我已经尝试过转义那些斜线,但是仍然失败。我该怎么做才能满足PHP?

1 个答案:

答案 0 :(得分:2)

反斜杠需要再次转义。这是因为有两个原因需要对它们进行转义:

  • 对于正则表达式
  • 对于PHP字符串文字(在regex101上不需要)

因此将您的代码更改为此:

preg_match_all('/("BINGO":")([^"\\\\]*(?:\\\\.[^"\\\\]*)*)(")/i', $source, $matches);