在PHP中,我使用此模式将绝对路径附加到CSS文件中的相对URL:
$sCssR = preg_replace('#url\((?!\s*[\'"]?(?:https?:)?//)\s*([\'"])?#', "url($1{$sRel}/", $sCss);
该模式运行良好,但SVG图像的数据网址也会受到影响。
示例:
<? ob_start(); ?>
.url { background:url("//www.test.com/img.png"; }
.url { background:url("http://www.test.com/img.png"; }
.url { background:url("../img/test.png"; }
.url { background:url("data:image/svg+xml;utf8,<svg><circle/></svg>"); }
<?
$sCss = ob_get_clean();
$sRel = '//www.test.com/folder';
$sCssR = preg_replace('#url\((?!\s*[\'"]?(?:https?:)?//)\s*([\'"])?#', "url($1{$sRel}/", $sCss);
print $sCssR;
?>
输出将是:
.url { background:url("//www.test.com/img.png"; }
.url { background:url("http://www.test.com/img.png"; }
.url { background:url("//www.test.com/folder/../img/test.png"; }
.url { background:url("//www.test.com/folder/data:image/svg+xml;utf8,<svg><circle/></svg>"); }
一切都很好,除了最后一行,不应该触及,应该是这样的:
.url { background:url("data:image/svg+xml;utf8,<svg><circle/></svg>"); }
任何人都可以帮我调整preg_replace模式,以便&#39;数据:&#39;网址不会被触及?
答案 0 :(得分:1)
在模式的末尾添加一个尾随的(*SKIP)(*FAIL)
组件:
~url\((?!\s*[\'"]?(?:https?:)?//)\s*([\'"])?(?:data:(*SKIP)(*FAIL)|)~
这将有效地&#34;取消资格&#34;你期待的网址。