在我们的一个项目中,我们在php中添加了某些路径的css背景图片网址,它不是以“http”,“网站”或“供应商”开头的,到目前为止,我们的表达式表现还不错,但它也包含了结果中的起始引用。任何帮助都是适当的
这是我的PHP代码
$array=[
'url("images")',
'url (\'images\')',
'url(vendor/)',
'url(website/)',
"url(http://)"
];
$pattern = '/url\s*\(\s*[\'"]?\/?([^(http|vendor|website)].+?)[\'"]?\s*\)/i';
$result=[];
foreach ($array as $test_string) {
$content = preg_replace($pattern, 'url('.'websites/abc/www/'.'$1)', $test_string);
$result[$test_string] = $content;
}
var_dump($result);
结果如下,注意引用www /“images
array (size=5)
'url("images")' => string 'url(websites/abc/www/"images)' (length=29)
'url ('images')' => string 'url(websites/abc/www/'images)' (length=29)
'url(vendor/)' => string 'url(vendor/)' (length=12)
'url(website/)' => string 'url(website/)' (length=13)
'url(http://)' => string 'url(http://)' (length=12)
感谢任何帮助,谢谢你提前。
您在正则表达式中将括号与括号混淆。前者定义了一个字符类,后者定义了一个组。要在匹配中否定模式,您应该使用负面的外观,这里负面的前瞻提供了解决方案。你最好通过在+
之后添加一个?
标志来制作引号并引导斜线占有率:
url\s*\(\s*[\'"]?+\/?+((?!http|vendor|website).+?)[\'"]?\s*\)
url\s*\(\s*
将url(
与括号内的可能空格相匹配[\'"]?+
引号的可选匹配但如果匹配则不允许回溯\/?+
斜线标记的可选匹配,但如果匹配则不允许回溯((?!http|vendor|website).+?)
捕获任何不以负向前瞻模式开头的东西[\'"]?\s*\)
url
结束