regex preg_replace_callback在.replace()的第一个参数内运行时除外

fv2wmkja  于 2022-11-26  发布在  其他
关注(0)|答案(1)|浏览(141)

我想对所有单引号或双引号字符串执行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,但这是关于匹配正则表达式的--我说的是排除它们。如果你把它们的正则表达式模式插入到我的代码中,它就不工作了--所以不应该被认为是一个有效的答案

p8h8hvxi

p8h8hvxi1#

您可以使用verbs(*SKIP)(*F)来 * 跳过 * 某些内容。对于跳过 * 第一个参数 *,例如:

\(\s*/.*?/\w*\h*,(*SKIP)(*F)|(?|(")[^"\\]*(?:\\.[^"\\]*)*"|(')[^'\\]*(?:\\.[^'\\]*)*')

See this demo at regex101your updated php demo
在 * 跳过的一面 * 上的模式非常简单,您可能想要further improve
此外,我使用了一个更有效的模式来匹配引用的部分,explained here

相关问题