PHP preg_replace用于以//开头的行上的任何内容

时间:2014-07-31 13:49:05

标签: php regex

我正在尝试从js文件中删除单行注释。当然,所有的行看起来都像:

// This is a comment in a js file

删除以//开头的行上的所有内容的正则表达式是什么?

我已经在使用此功能删除多行注释:

/* This is a
   multi-line comment */

$js = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $js_contents);

谢谢!

4 个答案:

答案 0 :(得分:1)

尝试这种更强大的解决方案:

$regex = <<<'REGEX'
((?:/\*[\s\S]*?\*/|"(?:[^\\"]|\\.)+"|'(?:[^\\']|\\.)+')(*SKIP)(?!)|//.*)
REGEX;
$js = preg_replace($regex,"",$js_contents);

说明:

  • 匹配
    • 所有多行/* ... */ - 样式评论*
    • 或所有双引号,单行字符串(多行字符串无效JS)
    • 或所有单引号的单行字符串
    • 跳过并执行上述
  • //匹配到该行的末尾
    • 将其删除

正则表达式动词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\>\/]*\>)

希望它有效:)

编辑:我使用第二个表达式进行了测试,它适用于单个注释:)

enter image description here

答案 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);