【问题标题】:PHP - Remove query string from font URLsPHP - 从字体 URL 中删除查询字符串
【发布时间】:2017-03-25 13:56:55
【问题描述】:

我在 PHP 变量中有这个字符串(示例):

@font-face {  
    src: url('../some-font.eot?v=4.6.3');
}

我需要在每一行上按 .eot? 进行搜索。如果找到,请进行替换,结果为:

@font-face {      
    src: url('../some-font.eot');
}

任何帮助将不胜感激。

【问题讨论】:

    标签: php regex replace preg-replace query-string


    【解决方案1】:

    直接使用\Q...\E 序列:

    \Q.eot?\E[^'")]+
    

    将其替换为.eot 并查看a demo on regex101.com\Q...\E 序列将其中的所有字符视为纯文字,因此不需要转义。

    【讨论】:

    • 非常感谢 Jan,您的解决方案也按预期工作。即使没有单引号或双引号,你有办法替换吗?示例:url(../some-font.eot?v=4.6.3);
    • @EduardoSR:当然,更新了演示 - 只需在字符类中添加另一个 )
    【解决方案2】:

    搜索字符串,然后搜索不是你的结束封装字符的所有内容。

    eot\?[^'"]+
    

    正则表达式演示:https://regex101.com/r/SEPPHc/1/

    PHP 演示:https://eval.in/761197

    PHP:

    $string = "@font-face {  
        src: url('../some-font.eot?v=4.6.3');
    }";
    echo preg_replace('/eot\?[^\'"]+/', 'eot', $string);
    

    【讨论】:

    • 非常感谢克里斯,它工作正常。即使没有单引号或双引号,你有办法替换吗?示例:url(../some-font.eot?v=4.6.3);
    • @EduardoSR 什么是一致的,总是以) 结尾?也许regex101.com/r/SEPPHc/2
    • 是的,总是。字符串可以是:url('../some-font.eot?v=4.6.3');url("../some-font.eot?v=4.6.3")url(../some-font.eot?v=4.6.3)
    • 我可以做第二个 preg_replace,不需要是唯一的正则表达式,因为你的第一个解决方案同时匹配双引号和单引号。
    • 我在没有引号的情况下测试了 SEPPHc/2,它正在删除右括号。如果我有引号,它会删除右引号和右括号。
    【解决方案3】:

    这里有一个广泛的正则表达式(它几乎可以匹配第一个 ? 之前的任何内容)但这应该为您提供路径的起点:

    echo preg_replace("/^([^?]+).*/", "$1", "../some-font.eot?v=4.6.3");
    

    打印:

    ../some-font.eot

    您需要移除锚点并添加一些上下文以在整个文件中进行搜索,例如使用正向回溯。

    echo preg_replace("/(?<=src: url\(')([^?]+)[^']*?/", "$1", "src: url('../some-font.eot?v=4.6.3');");
    

    打印:

    src: url('../some-font.eot');

    lookbehind 将确保您最终只替换您关心的 URL(例如,它不会触及 cmets、content 属性等)。

    【讨论】:

      猜你喜欢
      • 2011-02-02
      • 1970-01-01
      • 2017-06-01
      • 2016-07-22
      • 2011-03-28
      • 1970-01-01
      • 2018-12-08
      相关资源
      最近更新 更多