Php 如何使用正则表达式使这些相对URL成为绝对URL?
我需要处理CSS文件以使任何相对路径(使用url())成为绝对路径。它应该以单引号、双引号或不带引号的形式匹配URI。更换件不应报价 例如 我尝试了许多不同的模式,包括前瞻性的/和下面的许多变体Php 如何使用正则表达式使这些相对URL成为绝对URL?,php,regex,Php,Regex,我需要处理CSS文件以使任何相对路径(使用url())成为绝对路径。它应该以单引号、双引号或不带引号的形式匹配URI。更换件不应报价 例如 我尝试了许多不同的模式,包括前瞻性的/和下面的许多变体 $dir = dirname($path); $r = preg_replace('#url\(("|\')?([^/"\']{1}.+)("|\')?\)#', "url(/$dir/$2)", $contents); 似乎做不好。有什么帮助吗?我想这应该可以: $r = preg_replace(
$dir = dirname($path);
$r = preg_replace('#url\(("|\')?([^/"\']{1}.+)("|\')?\)#', "url(/$dir/$2)", $contents);
似乎做不好。有什么帮助吗?我想这应该可以:
$r = preg_replace('#url\(("|\'|)([^/"\'\)][^"\'\)]*)("|\'|)\)#', 'url(/'.$dir.'/$2)', $contents);
你可以简化两件事。首先,对于匹配引号,您应该使用
[“]”?
而不是组。对于检测相对路径名,请检查是否存在字母,而不是斜杠
preg_replace('#url\( [\'"]? (\w[^)"\']+) [\'"]? \)#x'
我正在使用
)
来检测大括号的结尾,而不是+
。虽然只列出允许的字符(如[\w/]+
会更可靠,但下面的情况如何:
$pattern = '#url\([\'"]?(\w[\w\./]+)[\'"]?\)#i';
$subjects = array(
'url(/foo/bar.png)',
'url(foo/bar.png)',
'url("foo/bar.png")',
'url(\'foo/bar.png\')',
);
foreach ($subjects as $subject) {
echo "$subject => ", preg_replace($pattern, "url(/path/to/$1)", $subject), "\n";
}
url(/foo/bar.png) => url(/foo/bar.png)
url(foo/bar.png) => url(/path/to/foo/bar.png)
url("foo/bar.png") => url(/path/to/foo/bar.png)
url('foo/bar.png') => url(/path/to/foo/bar.png)
产出如下:
$pattern = '#url\([\'"]?(\w[\w\./]+)[\'"]?\)#i';
$subjects = array(
'url(/foo/bar.png)',
'url(foo/bar.png)',
'url("foo/bar.png")',
'url(\'foo/bar.png\')',
);
foreach ($subjects as $subject) {
echo "$subject => ", preg_replace($pattern, "url(/path/to/$1)", $subject), "\n";
}
url(/foo/bar.png) => url(/foo/bar.png)
url(foo/bar.png) => url(/path/to/foo/bar.png)
url("foo/bar.png") => url(/path/to/foo/bar.png)
url('foo/bar.png') => url(/path/to/foo/bar.png)
- 匹配
url
- 匹配开放paren
- 开放捕获组1
- “匹配”或“零或一次”
- 近距离捕捉组1
- 公开组2
- 匹配一个不是字符的字符/
- 不精确地匹配零个或多个字符
- 近距离捕捉组2
- 匹配捕获组1中捕获的任何内容(这确保了相同的报价匹配,并且在1未捕获报价时有效)
- 相配
捕获组2包含目标数据。为什么不将它们与css放在同一目录中并跳过所有路径?不知道可以在模式中使用引用。但是不起作用。。例如背景中的结果:url(/foo/bar/“/images/image.png”)Hmm对我有用。。让我看看我粘贴的时候是否洒了一点。不,对我有用。没有得到报价。如果您以任何方式调整它,在某个地方添加括号,那么$2可能必须更改为另一个捕获组。以下是我从测试输出中得到的结果:
background:url(“foo/bar.png”)=>background:url(/J:\PROJECTS\PhpTestProject1/foo/bar.png)
。需要注意的一点是,$dir=dirname(\uu文件\uu)代码>在这种情况下可能无法在Windows上正常工作:-普韦尔德。引号总是包含在$2中,这是有意义的,因为$2是贪婪的,$1和$2不是贪婪的。$2==([^/].*)
不是贪婪的,除了第一个字符。不过,我在url(“”)
上测试了它,结果不匹配。可能只是你在做的事情和我不一样。在任何情况下,对我都有效。:-)作品不知道你能做到”(a | b |)。谢谢。更快,结果相同:$r=preg\u replace(“#url([\'”]?([^“\')]+)[\'”]?)#',“url(/'.$dir./$1)”,$contents);