【问题标题】:preg_replace regex to match 6 identical characterspreg_replace 正则表达式匹配 6 个相同的字符
【发布时间】:2014-05-21 12:31:23
【问题描述】:

我的 SVG 文件在路径上填充,如下所示:

<path fill="#FFFFFF" ... />
<path fill="#CCCCCC" ... />
<path fill="#DDDDDD" ... />

我可以通过将 6 个相同字符的任何填充替换为 3 个字符来稍微减小文件大小,从而产生:

<path fill="#FFF" ... />
<path fill="#CCC" ... />
<path fill="#DDD" ... />

我不确定我的 php preg_replace 中的正则表达式会如何查找这个。我想它会这样开始:

$fileContent = preg_replace('/fill="#/','',$fileContent);

请注意,这 6 个相同的字符可以是字母数字,也可以是任何颜色,不仅仅是我的示例。

【问题讨论】:

    标签: php html xml regex svg


    【解决方案1】:

    试试这个:

    $text = <<<EOT
    <path fill="#FFFFFF" ... />
    <path fill="#CCCCCC" ... />
    <path fill="#DDDDDD" ... />
    EOT;
    
    $text = preg_replace('/fill="#(.)\1{5}/', 'fill="#$1$1$1', $text);
    print "$text\n";
    

    这里(.) 捕获第一个字符并使用反向引用\1{5} 它检查接下来的五个字符是否相同。如果是,则替换为三个$1,其中包含正则表达式中使用的(.) 的值。

    【讨论】:

    • 这是一个很好的答案,我可能会将其用于正则表达式 /fill="#([\da-f])\1{5}/i 以仅匹配 0-9 和 A-F,不区分大小写
    【解决方案2】:

    你可以使用:

    $s = '<path fill="#FFFFFF" ... />';
    echo preg_replace('/(fill="#)([0-9A-F])\g{-1}{5}/i', '$1\2\2\2', $s);
    //=> <path fill="#FFF" ... />
    

    \g{-1} 是对最近组的反向引用。

    【讨论】:

    • 我以前从未使用过\g{-1}。它对我来说是新的。谢谢。
    • 我相信这是 PCRE 功能,虽然没有在 Javascript 上尝试过。
    • 很有趣,已经从\g 读过,但不是来自\g{-1} 之类的东西,谢谢您的输入:) 非常好!
    【解决方案3】:

    尝试使用back references,例如:

    $fileContent = preg_replace('/(fill="#)(.)\2{5}/', '\1\2\2\2', $fileContent);
    

    这将匹配fill="#XXXXXX 之类的任何字符串,并将其替换为fill="#XXX 之类的字符串。

    但是,像 #FFCC99 can also be shortened#FC9 这样的十六进制颜色代码。如果你也想处理这种情况,你可以尝试这样的事情:

    $fileContent = preg_replace('/(fill="#)(.)\2(.)\3(.)\4/', '\1\2\3\4', $fileContent);
    

    这将匹配fill="#XXYYZZ 之类的任何字符串,并将其替换为fill="#XYZ 之类的字符串。

    【讨论】:

    • 但我只想匹配 6 个相同的字符,例如 fill="#FFFFFF" 而不是 fill="#F8F8F8"fill="#FFCCAA"
    • @Coop 好吧,如果这是一个要求,请参阅我更新的答案以获取替代方案。顺便说一句,这些模式都不匹配fill="#F8F8F8"
    • 这似乎最合理
    【解决方案4】:

    一个快速而肮脏的解决方案是:

    $regex = "/#(0{6}|1{6}|...|E{6}|F{6}/";
    

    不是最优雅的解决方案,但它可以完成工作。

    【讨论】:

      猜你喜欢
      • 2021-05-10
      • 1970-01-01
      • 2015-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      相关资源
      最近更新 更多