2015-12-30 58 views
1

这是情景:的preg_match - 执行console.log去除

  1. JS文件加载到字符串中使用的file_get_contents
  2. 我想删除从中
  3. 所有调试信息对于找出什么目的在发生的PHP代码我使用 的preg_match

我使用这个表达式:

(\/\/)?(\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]); 

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

回答

1

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

@Jan

您的回答让我朝正确的方向发展。

((\/\/)?(\s*?)console\.(log|debug|info|log|warn|error|assert|dir|dirxml|trace|group|groupEnd|time|timeEnd|profile|profileEnd|count)(\s*?)\((.*[^}(])(\){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

+0

很好的简化。 :) 是的,我需要不同的变种,如日志,警告等。 我在PHP调试过程中发现,有些行中有这种console.log: console.log(fdv + some_function()) }); 注意到最后一些函数的关闭。我不希望那部分被删除。 – BeeEm

+0

@BeeEm要捕获方法名称,请参阅我的更新答案。 – Jan

+1

我觉得你不了解我很好。对不起,我造成了困惑。我不需要获取函数名称,我想删除所有类型的调试信息,如console.log,console.warn等。这就是为什么我有(日志|警告|信息|调试|错误)。这种线可以在开始时//或不在。 Console.log不需要以分号结尾。 JS代码可能很混乱,它可能碰巧有这样一行:console.warn('something')});你的正则表达式可以将所有内容匹配到分号,从而有效地将闭包在JS代码中打开,至少会产生语法错误。 – BeeEm

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,然后是文字点.,后面至少有一个字母字符。
  • \(.*?$ - 找到一个左括号,并抓住所有行结束。
+0

简化,但不涵盖一些可能的事件正确。考虑这一行: console.log(“actual:”+ getActualPreTop())}); 您的模式将一直匹配到最终会产生错误。 – BeeEm