我想对所有单引号或双引号字符串执行php preg_match_callback
,为此我使用了https://codereview.stackexchange.com/a/217356上的代码,其中包括对反斜杠单引号/双引号的处理。
const PATTERN = <<<'PATTERN'
~(?|(")(?:[^"\\]|\\(?s).)*"|(')(?:[^'\\]|\\(?s).)*'|(#|//).*|(/\*)(?s).*?\*/|(<!--)(?s).*?-->)~
PATTERN;
$result=preg_replace_callback(PATTERN, function($m) {
return $m[1]."XXXX".$m[1];
}, $test);
但是当扫描像在来自JavaScript的.replace()调用中看到的块时,这遇到了问题,例如。
x=y.replace(/'/g, '"');
...将'/g, '
视为字串,并将"');......."
视为下列字串。
为了解决这个问题,我认为最好进行回调,除非引号在.replace()的第一个参数内,因为这会导致引号问题。
例如,执行标准回调,但当涉及.replace
时,我希望更改abc.replace(/\'/, "XXXX");
的XXXX
部分,但希望忽略\'
引用/部分。
我该怎么做?
请访问https://onlinephp.io/c/5df12**https://onlinephp.io/c/8a697查看运行示例,其中显示了一些成功(绿色)和一些失败(红色)。(**编辑以更正缺少的斜线)
请注意,XXXX是预留位置,供稍后进行更多工作之用。
还要注意的是,我已经看过Javascript regex to match a regex,但这是关于匹配正则表达式的--我说的是排除它们。如果你把它们的正则表达式模式插入到我的代码中,它就不工作了--所以不应该被认为是一个有效的答案
1条答案
按热度按时间p8h8hvxi1#
您可以使用verbs
(*SKIP)(*F)
来 * 跳过 * 某些内容。对于跳过 * 第一个参数 *,例如:See this demo at regex101或your updated php demo
在 * 跳过的一面 * 上的模式非常简单,您可能想要further improve。
此外,我使用了一个更有效的模式来匹配引用的部分,explained here。