【问题标题】:PHP Regex to remove comments when minifying JavascriptPHP Regex 在缩小 Javascript 时删除注释
【发布时间】:2015-05-01 14:44:23
【问题描述】:

代码:

$buffer = '
//Test
var url = \'http://test.com\';
var x = \'foo\'; // test
var myregex = \'/(*)?//\'';
echo preg_replace("/(?:\/\/.*)/", "", $buffer);

结果:

var url = 'http://
var x = 'foo'; 
var myregex = '/(*)?`

预期结果:

var url = 'http://test.com';
var x = 'foo'; 
var myregex = '/(*)?//'

是缩小 JavaScript 的第一步,但我没有看到解决方案。

有什么建议吗?

【问题讨论】:

  • 是缩小 JavaScript 的第一步:你知道你在重新发明轮子吗?
  • 看起来您的正则表达式正在执行您指定的操作:从每一行中删除 // 及其后面的所有内容。缩小不仅仅是删除 cmets(例如,还减少了私有标识符的大小)。为此,您需要解析语言。但既然这是一个已解决的问题,为什么要这样做呢?
  • 我可以完全关闭,但使用 ?使 .* 变得懒惰,而不是贪婪,因此它不会匹配任何内容,而不是所有内容。
  • @kainaw .*? 会很懒惰,代码中的(?: ... .*) 只是一个非存储的子模式。
  • 我想你的意思是:uglifyjs --compress --mangle -- input.js

标签: javascript php regex minify


【解决方案1】:

用 RegEx 做到这一点会非常困难。

使用正则表达式:

  • 您应该使用lookbehind assertions 通过测试'" 来检查// 是否不在字符串序列中。
  • 一行也可能有多个字符串,例如"http://", "https://",因此您需要嵌套断言。
  • 字符串可以包含在'" 中,因此您应该找到一种测试方法:"http://", 'https://'

其他选项

另一个选项和最合适的解决方案是逐个字符地遍历字符串并保留一组布尔变量来跟踪代码字符串的“状态”。例如,跟踪是否在字符串中:if ($char == '"') { $inString = true; }

上面是一个简单的例子。当您要真正做到这一点时,您可能最好编写 OOP 代码来解析它并将处理的字符串和当前字符传递给处理不同类型代码的不同对象。这太宽泛了,无法在这里完整地解释它..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-05
    • 2023-03-08
    • 2015-03-28
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    相关资源
    最近更新 更多