Preg_replace:将绝对路径附加到网址但排除数据网址

时间:2018-02-15 13:20:28

标签: php css regex preg-replace

在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;网址不会被触及?

1 个答案:

答案 0 :(得分:1)

在模式的末尾添加一个尾随的(*SKIP)(*FAIL)组件:

~url\((?!\s*[\'"]?(?:https?:)?//)\s*([\'"])?(?:data:(*SKIP)(*FAIL)|)~

Pattern Demo

这将有效地&#34;取消资格&#34;你期待的网址。