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

Preg_replace: append absolute path to url but exclude data url

在 PHP 中,我使用此模式将绝对路径附加到我的 CSS 文件中的相对 URL:

$sCssR = preg_replace('#url\((?!\s*[\'"]?(?:https?:)?//)\s*([\'"])?#', "url({$sRel}/", $sCss);

该模式运行良好,但 数据 URL(如 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({$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 模式以便 'data:' URL 不会被触及吗?

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

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

(Pattern Demo)

这将有效地 "disqualify" 网址如您所愿。