【问题标题】:Replace CSS url()'s?替换 CSS url() 的?
【发布时间】:2012-04-17 08:33:06
【问题描述】:

假设我有一个字符串 $my_css_string,我们知道它包含 CSS 样式。

现在想象一下,我有一个函数 string url_replace(string $url),它返回一个修改后的 URL,我想用 $my_css_string 中的每个 url() 替换它。

因此,为简单起见,假设url_replace() 总是返回字符串"xxxx"

您如何通过$my_css_string,在字符串中找到每个url(),然后用您从url_replace() 获得的网址替换该网址?


所以,如果你有这个 CSS 为 $my_css_string:

@import url('http://example.com/css/animals.css');
.dog {
    background:url("/images/dog.png");
    border:1px solid rgb(0,0,128);
}
.cat {
    background:url(http://example.com/images/cat.gif);
}

如果您运行代码,$my_css_string 将变为:

@import url('xxxx');
.dog {
    background:url( "xxxx" );
    border:1px solid rgb(0,0,128);
}
.cat {
    background:url(xxxx);
}

注意它需要如何处理定义 URL 的多种方式。

我该怎么做?

【问题讨论】:

    标签: php css regex url


    【解决方案1】:

    你想使用preg_replace_callback:

    $my_new_css_string = preg_replace_callback(
                            '/background-image:\s*url\(\s*([\'"]*)(?P<file>[^\1]+)\1\s*\)/i',
                            'url_replace',
                            $my_css_string);
    

    【讨论】:

      【解决方案2】:

      你看过这个:http://us3.php.net/manual/en/function.preg-replace-callback.php。您应该能够搜索“url(.*)”,然后在回调中实现自定义逻辑以处理各种替换场景。

      【讨论】:

        【解决方案3】:

        如果你不是那么挑剔,你可以使用下面的表达式来匹配url()s:

        /\b url\( \s*+ \K  (?| (") ( (?>[^"\\]++|\\.)*+ ) " | (') ( (?>[^'\\]++|\\.)*+ ) ' | () ([\S)]*+) )  ( \s*+ \) )/ix
        

        此表达式将正确处理转义,但也可以匹配 cmets 和字符串,这可能不是我们所希望的。

        然后您可以将其与preg_replace_callback 或仅与/e 一起使用,例如:

        preg_replace('/\b url\( \s*+ \K  (?| (") ( (?>[^"\\\\]++|\\\\.)*+ ) " | (\') ( (?>[^\'\\\\]++|\\\\.)*+ ) \' | () ([\S)]*+) )  ( \s*+ \) )/ixe', '"$1" . url_replace("$2") . "$1$3"', $css);
        

        【讨论】:

          猜你喜欢
          • 2018-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-11
          • 1970-01-01
          • 1970-01-01
          • 2019-03-04
          相关资源
          最近更新 更多