我正在尝试从js文件中删除单行注释。当然,所有的行看起来都像:
// This is a comment in a js file
删除以//
开头的行上的所有内容的正则表达式是什么?
我已经在使用此功能删除多行注释:
/* This is a
multi-line comment */
$js = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $js_contents);
谢谢!
答案 0 :(得分:1)
尝试这种更强大的解决方案:
$regex = <<<'REGEX'
((?:/\*[\s\S]*?\*/|"(?:[^\\"]|\\.)+"|'(?:[^\\']|\\.)+')(*SKIP)(?!)|//.*)
REGEX;
$js = preg_replace($regex,"",$js_contents);
说明:
/* ... */
- 样式评论* //
匹配到该行的末尾
正则表达式动词FTW
*如果您已删除多行注释
,则可以删除此部分编辑:您可能希望为多行注释正则表达式使用类似的构建:
$regex = <<<'REGEX'
((?:"(?:[^\\"]|\\.)+"|'(?:[^\\']|\\.)+')(*SKIP)(?!)|/\*[\s\S]*?\*/)
REGEX;
$js_without_multiline_comments = preg_replace($regex,"",$js_contents);
这将允许您在JS字符串中使用/*
而不会导致问题。
几点说明:
使用NOWDOC字符串语法可以编写正则表达式而无需花费多年时间来担心“PHP或正则表达式是否会读取这种反斜杠?”。每次这样都会给正则表达式。
使用[\s\S]
代替.
可以进行多行匹配。 s
修饰符不适用于此处,因为我们希望匹配单行字符串。
答案 1 :(得分:0)
试试这个正则表达式:
$js= preg_replace('#^\s*//.+$#m', "", $source);
或另一个:
(\/\*[\w\'\s\r\n\*]*\*\/)|(\/\/[\w\s\']*)|(\<![\-\-\s\w\>\/]*\>)
希望它有效:)
编辑:我使用第二个表达式进行了测试,它适用于单个注释:)
答案 2 :(得分:0)
已经使用包含此代码的一个javascript文件进行测试并测试此php脚本并删除所有评论,试一试:
<?php
$js = file_get_contents('script.js', true);
try {
$newjs= preg_replace("/(?:\/\*(?:[\s\S]*?)\*\/)|(?:([\s;])+\/\/(?:.*)$)/m", ' ', $js);
} catch(Exception $e) {
echo $e;
}
echo $js . '<br/><br/>';
echo $newjs;
?>
<强>的script.js 强>
function getPNGBase64forHtml(container) {
var imageString;
html2canvas(document.body, {
useCORS: true,
logging : true,
proxy :"html2canvasproxy.php",
onrendered: function(canvas) {
var img = new Image();
img.onload = function() {
img.onload = null;
document.body.appendChild(img);
};
img.onerror = function() {
img.onerror = null;
if(window.console.log) {
window.console.log("Not loaded image from canvas.toDataURL");
} else {
alert("Not loaded image from canvas.toDataURL");
}
};
imageString = canvas.toDataURL('image/png');
}
});
return imageString;
}
// function getPNGBase64forHtml($container) {
// var h2canvas = html2canvas($container);
// var queue = h2canvas.parse();
// var canvas = h2canvas.render(queue);
// return canvas.toDataURL('image/png');
// }
答案 3 :(得分:0)
感谢大家的建议,但没有人负责正确删除评论。我发现这个解决方案看起来效果很好 - 删除单行和多行注释,无论它们出现在行的开头还是结尾:
$expr = '/(?:(?:\/\*(?:[^*]|(?:\*+[^*\/]))*\*+\/)|(?:(?<!\:|\\\)\/\/.*))/';
$js = preg_replace($expr, '', $contents);