preg_match - console.log删除

时间:2015-12-30 21:20:45

标签: php preg-match

这是情景:

  1. 使用file_get_contents
  2. 将JS文件加载到字符串中
  3. 我想从中删除所有调试信息
  4. 为了找出我在PHP代码中发生的事情 使用 preg_match
  5. 我正在使用这个表达式:

    (\/\/)?(\s*?)console\.(log|debug|info|log|warn|error|assert|dir|dirxml|trace|group|groupEnd|time|timeEnd|profile|profileEnd|count)\((.*?[^}(])\);?$
    

    在匹配的regex101phpliveregex网站上:

    //console.log(abc)
    //   console.log(abc)
    // console.log(abc);
    // console.log('abc');
    console.log(abc);
    console.log('abc' + some_function());
    etc...
    

    但是当我把它放在这样的PHP代码中时:

    preg_match('/(\/\/)?(\s*?)console\.(log|debug|info|log|warn|error|assert|dir|dirxml|trace|group|groupEnd|time|timeEnd|profile|profileEnd|count)\((.*?[^}(])\);?$/', $js_code, $matches);
    if (!empty($matches[0])) print_r($matches[0]);
    

    我没有得到任何比赛。太累了注意到我错过了什么。可能是用大眼睛盯着我的东西。 :) 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:1)

经过进一步调查后,我改进了我的正则表达式以匹配每个组合。

@Jan

你的回答让我朝着正确的方向前进。

((\/\/)?(\s*?)console\.(log|debug|info|log|warn|error|assert|dir|dirxml|trace|group|groupEnd|time|timeEnd|profile|profileEnd|count)(\s*?)\((.*[^}(])(\){1,});?)

答案 1 :(得分:0)

为什么这么复杂?您是否需要在不同功能(log等)之间进行区分?以下正则表达式匹配您上面的所有示例。在此处查看working demo

$regex = '/(?<console>(?:\/\/)?\s*console\.[^;]+;)/g';
# captured group named console with two forward slashes optionally
# followed by whitespaces (or not)
# match console. literally then anything up to a semicolon

preg_match_all($regex, $js_string, $matches);
print_r($matches["console"]);

根据您的评论,如果您还需要匹配实际的方法名称,您可以像这样更改正则表达式:

$regex = '/(?<console>(?:\/\/)?\s*console\.(?<function>[^(]+)[^;]+;)/g';

现在$matches["function"]保留实际的方法名称,请参阅a demo for this here

答案 2 :(得分:0)

所以这就是我为解决你的问题而采取的措施。希望它适合你。

// DEFINE THE STRING
$string = "
<br>Other Text Goes Here
//console.log(abc)
//   console.log(abc)
// console.log(abc);
// console.log('abc');
<br>More Text Here
console.log(abc);
console.warn('abc' + some_function());
console.log('abc' + some_function());
<br>And More Text Goes Here";

// DO THE PREG_MATCH_ALL TO FIND ALL OCCURRENCES
preg_match_all('~(?://)?\s*console\.[A-Z]+\(.*?$~sim', $string, $matches);
print "<pre>"; print_r($matches[0]); print "</pre>";

这将为您提供以下内容:

Array
(
    [0] => //console.log(abc)
    [1] => //   console.log(abc)
    [2] => // console.log(abc);
    [3] => // console.log('abc');
    [4] => 
console.log(abc);
    [5] => 
console.warn('abc' + some_function());
    [6] => 
console.log('abc' + some_function());
)

找到它们是一回事,但与用空字符串实际替换它的出现并没有太大的不同。这样的事情可以解决问题:

print preg_replace('~((?://)?\s*console\.[A-Z]+\(.*?$)~sim', '', $string);

这将在浏览器中显示:

Other Text Goes Here
More Text Here
And More Text Goes Here

这是一个工作演示,供您查看:

http://ideone.com/Vv0cGY

说明:

(?://)?\s*console\.[A-Z]+\(.*?$

  • (?://)? - 查找可选的两个正斜杠。前面的?:告诉它找到它,但不记得它。
  • \s* - 查找可能存在或不存在的空格。
  • console\.[A-Z]+ - 将匹配console,后跟一个文字点.,后跟至少一个字母字符。
  • \(.*?$ - 找到一个开括号并在整行后抓住所有内容。