我有一个regex(https://regex101.com/r/3a9OKx/1),它可以完全(我希望)检测javascript注解,这个regex似乎可以检测//
和/* ... */
,同时忽略引号中的注解和.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
我该怎么做呢?
1条答案
按热度按时间olmpazwi1#
首先:regex不是合适的工具,例如,它不能识别JavaScript模板文字,这些文字有自己的特殊性(例如,多行,与
String.raw
一起使用,...)。但你的当务之急是:regex101和PHP的不同之处在于,第二种方法缺少多行模式修饰符,这意味着对
^
和$
锚点的解释不同。通过在正则表达式末尾追加
m
来修复它: