(Java)RegEx从CSS获取URL?

时间:2011-01-10 23:37:24

标签: java css regex

我正在解析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的正则表达式实现(不是我最喜欢的)。

3 个答案:

答案 0 :(得分:6)

正则表达式的问题在于它们有时候比你需要的要严格得多。如果您向我们展示了您当前不完美正常的正则表达式,我本可以为您提供更多帮助。

第一条评论:浏览器倾向于容忍 HTML / CSS错误的大部分(不是JavaScript,这是一种编程而不是标记语言)。

您可以从background(-image)?令牌开始锁定第一部分。如何进行?很难......

你总是有冒号,所以你可以添加到令牌的常量部分,然后从你的例子(不是来自CSS规范)判断可变数量的空格,然后是url令牌。 变量数的空格为[\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组中排除空格,但是,应该匹配其中包含空格的网址,哪些不应该是正确的,例如您没有%20test4.gif文件

[编辑] 我更喜欢以下版本的正则表达式

background(-image)?: url[\s]*\([\s]*(?<url>[^\)]*)[\s]*\)[\s]*;

它容忍更多的空格

答案 1 :(得分:1)

你可以只使用正则表达式吗?如果使用字符串函数删除所有空格,那么你的生活可以变得如此简单,那么你就可以编写一个不必担心空格的正则表达式。

这是一个快速的,可能效果不好:

background(-image)?:url\(["']?(.*)["']?\);

第二个捕获组应该给你你想要的东西。

.*应该替换为包含有效路径可以包含的所有字符的字符类。

答案 2 :(得分:0)

正则表达式真的很难维护。我建议你看看SAC:

http://www.w3.org/Style/CSS/SAC/Overview.en.html