我正在解析 CSS 以从链接的样式表中获取 URL。这是一个 Java 应用程序。 (我尝试使用 CSSParser ( http://cssparser.sourceforge.net/ ),但是,它在解析时会自动删除许多规则。)
所以我只是在使用正则表达式。我想要一个只获取 URL 的正则表达式,并且足够强大以处理来自野外的真实 css:
background-image: url('test/test.gif');
background: url("test2/test2.gif");
background-image: url(test3/test3.gif);
background: url ( test4/ test4.gif );
background: url( " test5/test5.gif" );
你明白了。这是 Java 的正则表达式实现(不是我最喜欢的)。
最佳答案
正则表达式的问题在于它们有时过于严格,超出了您的需要。如果您向我们展示了您目前工作不完美的正则表达式,我将能够为您提供更多帮助。
第一条评论:浏览器倾向于容忍大多数 HTML/CSS 错误(不是 JavaScript,它是一种编程而非标记语言)。
您可以从 background(-image)?
标记开始以锁定第一部分。如何进行?很难...
你总是有冒号,所以你可以添加到 token 的常量部分,然后,根据你的示例(而不是 CSS 规范)判断可变数量的空格,后跟 url
token 。 可变数量的空格是[\w]*
,这成为我们正则表达式的一部分。
我用 RegexBuddy 试过了
background(-image)?: url[\s]*\([\s]*(?<url>[^\)]*)\);
不幸的是,它会捕获 URL 中的空格
Matched text: background-image: url('test/test.gif');
Match offset: 0
Match length: 39
Backreference 1: -image
Backreference 1 offset: 10
Backreference 1 length: 6
Backreference 2: 'test/test.gif'
Backreference 2 offset: 22
Backreference 2 length: 15
Matched text: background: url ( test4/ test4.gif );
Match offset: 119
Match length: 39
Backreference 1:
Backreference 1 offset: -1
Backreference 1 length: 0
Backreference 2: test4/ test4.gif
Backreference 2 offset: 138
Backreference 2 length: 18
因此,当您使用此获取 URL 时,您必须修剪字符串。在示例 4 中,我无法从 url
组中排除空格,但是,它应该匹配其中包含空格的 URL,而这不应该是正确的只要你没有 %20test4.gif
文件
[编辑] 我更喜欢以下版本的正则表达式
background(-image)?: url[\s]*\([\s]*(?<url>[^\)]*)[\s]*\)[\s]*;
它容忍更多的空格
关于java - (Java) RegEx 从 CSS 获取 URLs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4652777/