【问题标题】:regular expression for css urlcss url的正则表达式
【发布时间】:2018-03-03 12:33:28
【问题描述】:

在我们的一个项目中,我们在 php 中附加了一个不以“http”、“website”或“vendor”开头的特定路径的 css 背景图像 url,到目前为止,我们的表达式做得很好,但它也包括起始引用结果。任何帮助都会得到帮助

这是我的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*\)

标签: php regex preg-match pcre


【解决方案1】:

您将正则表达式中的括号与括号混淆了。前者定义一个字符类,后者定义一个组。要否定匹配中的模式,您应该使用否定的lookarounds,这里否定的lookahead 提供了一个解决方案。您最好在? 之后添加+ 符号,从而使引号和前导斜杠具有所有格:

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

RegEx live demo

PHP live demo

【讨论】:

    猜你喜欢
    • 2014-03-13
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多