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)|)~
这将有效地 "disqualify" 网址如您所愿。
在 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)|)~
这将有效地 "disqualify" 网址如您所愿。