想象一下,我有一个字符串$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的多种方式。
我该怎么做?
答案 0 :(得分:2)
$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);