Php 如何使用正则表达式使这些相对URL成为绝对URL?

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(

我需要处理CSS文件以使任何相对路径(使用url())成为绝对路径。它应该以单引号、双引号或不带引号的形式匹配URI。更换件不应报价

例如

我尝试了许多不同的模式,包括前瞻性的/和下面的许多变体

$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);