regex 如何在php中实现一个检测javascript注解的正则表达式

xmd2e60i  于 2023-01-14  发布在  PHP
关注(0)|答案(1)|浏览(115)

我有一个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

我该怎么做呢?

olmpazwi

olmpazwi1#

首先:regex不是合适的工具,例如,它不能识别JavaScript模板文字,这些文字有自己的特殊性(例如,多行,与String.raw一起使用,...)。
但你的当务之急是:regex101和PHP的不同之处在于,第二种方法缺少多行模式修饰符,这意味着对^$锚点的解释不同。
通过在正则表达式末尾追加m来修复它:

$regex=<<<'PATTERN2'
~((["'])(?:\\[\s\S]|.)*?\2|(?:[^\w\s]|^)\s*\/(?![*\/])(?:\\.|\[(?:\\.|.)\]|.)*?\/(?=[gmiy]{0,4}\s*(?![*\/])(?:\W|$)))|\/\/.*?$|\/\*[\s\S]*?\*\/~m
PATTERN2;

相关问题