【问题标题】:How to implement a regex that detects javascript comments into php如何实现一个检测 javascript 注释到 php 的正则表达式
【发布时间】: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 只是不会在这里工作。

标签: php regex


【解决方案1】:

首先:正则表达式不是正确的工具。例如,它不识别 JavaScript 模板文字,它们有自己的特殊性(例如,多行,与 String.raw 一起使用,...)。

但对于您眼前的问题:您的 regex101 和 PHP 尝试之间的区别在于第二个缺少多行模式修饰符,这意味着 ^$ 锚点的解释不同。

通过在正则表达式末尾附加 m 来修复它:

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

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 2020-02-02
    • 1970-01-01
    • 2012-01-10
    • 2011-08-19
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 2011-07-11
    相关资源
    最近更新 更多