【问题标题】:Regular expression to convert/normalize multiline string to single string正则表达式将多行字符串转换/规范化为单个字符串
【发布时间】:2013-02-08 22:44:31
【问题描述】:

输入是一个多行字符串,例如:

    table {
      border:0;
      border-spacing:0;
      border-collapse:collapse;
      margin-left:auto;                 // 'align:center' equivalent
      margin-right:auto;
    }

输出是一个单行字符串,删除了“额外”空格和 cmets,例如:

    table { border:0; border-spacing:0; border-collapse:collapse; margin-left:auto;}

使用 Perl 的一种方法是:

    #! perl -w
    use strict;

    my $css = <<CSS;
    table {
      border:0;
      border-spacing:0;
      border-collapse:collapse;
      margin-left:auto;                 // 'align:center' equivalent
      margin-right:auto;
    }
    CSS

    $css =~ s/\s{2,}/ /g;   # globally replace 2 or more whitespace with 1 space
    $css =~ s|\s+//.+\n||g; # globally replace C comment with empty string
    $css =~ s|\n||g;        # globally replace newline with empty string

    print $css;

我尝试在 PHP 中做类似的事情,但它对输入没有任何作用:

    <?php

    define("CSS_TABLE",
    "table {
      border:0;
      border-spacing:0;
      border-collapse:collapse;
      margin-left:auto;              // 'align:center' equivalent
      margin-right:auto;
    }");

    $css = CSS_TABLE;

    preg_replace("/\s\s+/", ' ', $css);
    preg_replace("/\s+\/\/.+\n/", '', $css);
    preg_replace("/\n/", '', $css);

    echo("CSS-min: $css\n\n");
    ?>

注意:'define' 不是问题,因为我也使用了 'here' 文档——这两种方式都没有乐趣。我显示的是“定义”而不是“此处”文档(如 Perl 示例中),因为现有的 PHP 代码使用它(以及一大堆其他代码!)。

我做错了什么?

【问题讨论】:

    标签: php preg-replace multilinestring


    【解决方案1】:

    像这样试试。

    首先你需要移除 cmets

    define("CSS_TABLE",
        "table {
          border:0;
          border-spacing:0;
          border-collapse:collapse;
          margin-left:auto;              // 'align:center' equivalent
          margin-right:auto;
        }");
    
        $css = CSS_TABLE;
    
        $css = preg_replace("#;\s*//.*#m", ';', $css);
        $css = preg_replace("/\s{2,}/", ' ', $css);
        $css = preg_replace("/[\n\r]+/", '', $css);
    
        echo("CSS-min: $css\n\n");
    

    结果是

    CSS-min: table { border:0; border-spacing:0; border-collapse:collapse; margin-left:auto; margin-right:auto; }
    

    【讨论】:

    • 谢谢你,温斯顿!我喜欢你的 .* 和我的 .+ 对于 cmets,因为你的只会照顾 //
    • @Scavokovich 是的。我的代码将关心 // 当 cmets 为空时。因为什么时候会去掉换行符 // 会注释掉 css 代码。
    • "#//.*#" 不会删除任何绝对 URL 吗?例如background-image : url('http://mysite.com/file.png'); 会变成background-image : url('http:
    【解决方案2】:

    试试这个

    define("CSS_TABLE",
    "table {
      border:0;
      border-spacing:0;
      border-collapse:collapse;
      margin-left:auto;              // 'align:center' equivalent
      margin-right:auto;
    }");
    
    $css = CSS_TABLE;
    $css = preg_replace("#//.*#", '', $css);
    $css = preg_replace("/\\s/", ' ', $css);
    $css = preg_replace("/\\s+/", ' ', $css);
    echo("CSS-min: $css");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 2022-11-18
      • 2017-09-08
      • 2013-06-09
      • 2015-09-09
      • 1970-01-01
      • 2017-05-15
      相关资源
      最近更新 更多