css url的正则表达式

问题描述 投票:1回答:1

在我们的一个项目中,我们在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)

感谢任何帮助,谢谢你提前。

php regex preg-match pcre
1个回答
0
投票

您在正则表达式中将括号与括号混淆。前者定义了一个字符类,后者定义了一个组。要在匹配中否定模式,您应该使用负面的外观,这里负面的前瞻提供了解决方案。你最好通过在+之后添加一个?标志来制作引号并引导斜线占有率:

url\s*\(\s*[\'"]?+\/?+((?!http|vendor|website).+?)[\'"]?\s*\)
  • url\s*\(\s*url(与括号内的可能空格相匹配
  • [\'"]?+引号的可选匹配但如果匹配则不允许回溯
  • \/?+斜线标记的可选匹配,但如果匹配则不允许回溯
  • ((?!http|vendor|website).+?)捕获任何不以负向前瞻模式开头的东西
  • [\'"]?\s*\) url结束

RegEx live demo

PHP live demo

© www.soinside.com 2019 - 2024. All rights reserved.