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