css url的正则表达式

时间:2018-03-03 12:33:29

标签: php regex preg-match pcre

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

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

1 个答案:

答案 0 :(得分:0)

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

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

RegEx live demo

PHP live demo