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)