【发布时间】:2023-01-12 18:12:00
【问题描述】:
我有一个正则表达式 (https://regex101.com/r/3a9OKx/1) 可以完全(我希望)检测到 javascript cmets。正则表达式似乎检测到 // 和 /* ... */ 以及忽略引号中的那些和 .replace(/'/... 周围的问题 - 这一切都很好。
但我不确定如何将其放入 php 中以删除那些检测到的项目。 我试过使用 preg_replace_callback (https://onlinephp.io/c/2d3e9) 但我似乎没有得到我想要的结果
$html=<<<'PATTERN'
doSomething('aaaaa//cccccccc'); // c1ccccccc
/* c2cc' cc'ccc */
doSomething2(111, 222, 333); // c3ccccccc
abc.replace(/'/g, 'aaaaaa//aaaaa'); /* c4ccccccc */
abc.replace(/"/g, 'aaaaaaa'); /* c5ccccccc */
doSomething("<div>aaaaaaaa//aaaaaaaaaaaaa aaaaaaa aaaaaaa</div>",1234);// c6ccccccc
doSomething('<div>aaaaaaaa//aaaaaaaaaaaaa aaaaaaa aaaaaaa</div>',1234);// c7ccccccc
PATTERN;
$regex=<<<'PATTERN2'
~((["'])(?:\\[\s\S]|.)*?\2|(?:[^\w\s]|^)\s*\/(?![*\/])(?:\\.|\[(?:\\.|.)\]|.)*?\/(?=[gmiy]{0,4}\s*(?![*\/])(?:\W|$)))|\/\/.*?$|\/\*[\s\S]*?\*\/~
PATTERN2;
$newJS = preg_replace_callback($regex
, function ($m) {
if ( strcmp(substr($m[0], 0, 2), "/*")==0 ) return "xx";
if ( strcmp(substr($m[0], 0, 2), "//")==0 ) return "xx";
return $m[0];
}, $js);
导致
doSomething('aaaaa//cccccccc'); // c1ccccccc
xx
doSomething2(111, 222, 333); // c3ccccccc
abc.replace(/'/g, 'aaaaaa//aaaaa'); xx
abc.replace(/"/g, 'aaaaaaa'); xx
doSomething("<div>aaaaaaaa//aaaaaaaaaaaaa aaaaaaa aaaaaaa</div>",1234);// c6ccccccc
doSomething('<div>aaaaaaaa//aaaaaaaaaaaaa aaaaaaa aaaaaaa</div>',1234);xx
那么我该怎么做呢?
【问题讨论】:
-
扔掉正则表达式并实现一个解析器。 RE 只是不会在这里工作。