替换CSS url()的?

时间:2012-04-03 16:27:30

标签: php css regex url

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

现在假设我有一个函数string url_replace(string $url),它返回一个修改后的网址,我希望将每个url()替换为$my_css_string

因此,为简单起见,我们说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的多种方式。

我该怎么做?

3 个答案:

答案 0 :(得分:2)

您想使用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);

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果您不那么挑剔,可以使用以下表达式匹配url() s:

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

此表达式将正确处理转义,但也可能在注释和字符串中匹配,这可能是不合需要的。

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

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