preg_replace()正则表达式匹配CSS文件中的相对url()路径

Wes*_*rch 7 php regex preg-replace

我正在组合一些CSS文件并将它们写入单独目录中的文件.我正在尝试替换相对url()值以使用新文件位置,忽略任何绝对URL.这是一些示例CSS:

#TEST {
    background:url(test.jpg);
    background:url( 'test.jpg' );
    background:url("test.jpg"  );
    background:url(http://example.com/test.jpg);
    background:url('https://example.com/test.jpg');
    background:url("http://example.com/test.jpg");
    background:url( '//example.com/test.jpg' );
    background:url( "//example.com/test.jpg" );
    background:url(//example.com/test.jpg);
}
Run Code Online (Sandbox Code Playgroud)

任何不能开始的东西http://,https://或者//应该$path在它之前注入的东西(只有前3个匹配).

期望的输出:

#TEST {
    background:url(/themes/default/css/test.jpg);
    background:url( '/themes/default/css/test.jpg' );
    background:url("/themes/default/css/test.jpg"  );
    background:url(http://example.com/test.jpg);
    background:url('https://example.com/test.jpg');
    background:url("http://example.com/test.jpg");
    background:url( '//example.com/test.jpg' );
    background:url( "//example.com/test.jpg" );
    background:url(//example.com/test.jpg);
}
Run Code Online (Sandbox Code Playgroud)

但是,此代码与之相反:

$path = '/themes/default/css/';
$search = '#url\(\s*([\'"]?)((http(s)?:)?//)#';
$replace = "url($1{$path}$2";
$css = preg_replace($search, $replace, $css);
Run Code Online (Sandbox Code Playgroud)

我知道你可以使用像!^(http)匹配,与开头的字符串http,但一切我尝试失败(我===坏的正则表达式).我一直在使用在线正则表达式测试仪来解决这个问题,但我确实陷入困境.

这可能不是我用来解决实际问题(确保路径在编译的CSS中工作),但任何人都可以帮我解决这个正则表达式问题,或者有更好的解决方案吗?

mat*_*fee 11

你几乎就在那里 - 你所追求的"以不匹配的字符串开头"被称为"负向前瞻"并且看起来像(?!http).

因此,如果url\(没有\s*['"]?(https?:)?//,请执行以下操作:

url\((?!\s*['"]?(http(s)?:)?//)
Run Code Online (Sandbox Code Playgroud)

(我保留了(s)捕获组,因为你想要捕获它,但你不需要围绕它的那些括号(s); s?就像(s)?你不关心捕获一样).

这里看到它.

编辑:

由于你想把$ path放在引号后面(如果有的话),我把正则表达式修改为:

url\((?!\s*['"]?(?:https?:)?//)\s*(['"])?
Run Code Online (Sandbox Code Playgroud)

即删除了我不关心的所有捕获括号,并添加了一个\s*(['"])?来捕获它是什么类型的引用.

认为这是在键盘这里,但为了以防万一,这里是代码:

$path = '/themes/default/css/';
$search = '#url\((?!\s*[\'"]?(?:https?:)?//)\s*([\'"])?#';
$replace = "url($1{$path}";
Run Code Online (Sandbox Code Playgroud)