我发现两个不同的正则表达式在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?
答案 0 :(得分:2)
反斜杠需要再次转义。这是因为有两个原因需要对它们进行转义:
因此将您的代码更改为此:
preg_match_all('/("BINGO":")([^"\\\\]*(?:\\\\.[^"\\\\]*)*)(")/i', $source, $matches);