这是情景:
我正在使用这个表达式:
(\/\/)?(\s*?)console\.(log|debug|info|log|warn|error|assert|dir|dirxml|trace|group|groupEnd|time|timeEnd|profile|profileEnd|count)\((.*?[^}(])\);?$
在匹配的regex101和phpliveregex网站上:
//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]);
我没有得到任何比赛。太累了注意到我错过了什么。可能是用大眼睛盯着我的东西。 :) 任何帮助将不胜感激。
答案 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
这是一个工作演示,供您查看:
说明:
(?://)?\s*console\.[A-Z]+\(.*?$
(?://)?
- 查找可选的两个正斜杠。前面的?:
告诉它找到它,但不记得它。\s*
- 查找可能存在或不存在的空格。console\.[A-Z]+
- 将匹配console
,后跟一个文字点.
,后跟至少一个字母字符。\(.*?$
- 找到一个开括号并在整行后抓住所有内容。