preg_match:JavaScript URL 字符串

3
我是一个有用的助手,可以为您翻译文本。

我正在尝试构建一个正则表达式模式,以将JavaScript脚本中的相对URL转换为绝对URL。

例如:我想替换以下所有实例(来自js脚本):

url('fonts/fontawesome-webfont.eot?v=4.2.0');

并返回以下内容:

url('http://example.com/fonts/fontawesome-webfont.eot?v=4.2.0');

以下是适用于HTML标签的示例模式 (链接):

$pattern = "#(<\s*a\s+[^>]*href\s*=\s*[\"'])(?!http)([^\"'>]+)([\"'>]+)#"

这种模式的首选用法:

$result = preg_replace($pattern,'$1http://example.com/$2$3', $result);

我最接近的猜测(不成功)是:
$pattern = "#(url\s*=\s*[\"'])(?!http)([\"'])#";

你的搜索字符串中没有=,或者不是形式为url =。尝试使用(url\(["'])(?!http) - chris85
3个回答

2

可能类似这样的东西适合您:

/(?<=url\((['"]))(?!http)(?=.*?\1)/

替换字符串:

http://example.com/

正则表达式演示

上面的正则表达式将匹配在url('之后的位置,引号可以是单引号或双引号。

(?<=...) # is a positive lookbehind
(?!...)  # is a negative lookahead
(?=...)  # is a positive lookahead
\1       # refers to capturing group 1, in this case either ' or "

请注意,JavaScript不支持向后查找,但PHP支持。

谢谢,这非常有帮助! - leenremm
@LeenRemmelzwaal,我希望我已经提供了足够的关于这个正则表达式如何工作的信息,你可以考虑在谷歌上查找“lookarounds” :-) - Andreas Louv

0

我的测试显示这将起作用:

/url\\(['\"](?!http[s]?:\\/\\/)(.+)['|\"]\\)/

因此,您的替换应该如下所示:

preg_replace("/url\\(['\"](?!http[s]?:\\/\\/)(.+)['|\"]\\)/",'http://example.com/$1', $result)

虽然我不是正则表达式专家,但请谨慎对待这个建议。


1
一个字符集是一个可选字符列表。所以s不需要在其中,['|\"]也不需要or,实际上or也使管道变为可选的。您还可以捕获第一个引号类型,并使用后向引用来确保匹配第二个引号类型。例如 https://regex101.com/r/sY5sN2/1(如果使用单引号包装正则表达式,则需要在双引号前加上\,如果使用双引号,则需要将\重复两次)。 - chris85

0
我使用的解决方案(感谢andlrc和chris85的帮助):
$result = preg_replace("#(?<=url\((['\"]))(?!https?)#",'http://example.com/', $result);

[s] 要求一个 s,你是想让 s 变成可选的吗? - chris85
好的,请问您建议我如何使“s”变成可选项? - leenremm
使用 s? 问号将使 s 匹配零次或一次。 - Andreas Louv
1
像这样 https?。此外,您的第二个和第三个捕获组为空,用 http://example.com/ 替换将产生相同的结果。https://eval.in/590456 中的 ? 使前一个字符或组变为可选项。 - chris85

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接