2011-01-10 2 views
1

Я разбираю CSS, чтобы получить URL-адреса из связанных таблиц стилей. Это приложение Java. (Я попытался с помощью CSSParser (http://cssparser.sourceforge.net/), однако, она молча сбросив многие из правил, когда он разбирает.)(Java) RegEx для получения URL-адресов из CSS?

Так что я просто с помощью Regex. Я хотел бы регулярное выражение, которое получает меня только 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

Последние два примера недействительны, по крайней мере, если я правильно прочитал спецификацию. Пробел разрешается только сразу после открытия и непосредственно перед закрытием. – Joey

+0

Вероятно, недействителен в соответствии со спецификацией, но все браузеры будут обрабатывать их. – mtyson

+0

Вам нужны только URL-адреса фонового изображения? Это не единственные места, где выполняется функция 'url()' CSS. – BoltClock

ответ

6

Проблема с регулярными выражениями заключается в том, что они иногда слишком строги, чем вам нужно. Если вы покажете нам свое настоящее не-отлично работающее регулярное выражение, я был бы в состоянии помочь вам больше.

Первый комментарий: браузеры склонны переносить большинство ошибок HTML/CSS (НЕ JavaScript, который является языком программирования, а не языком разметки).

Вы можете начать с токена background(-image)?, чтобы заблокировать первую часть. Как действовать? Очень сложно ...

У вас всегда есть двоеточие, поэтому вы можете добавить к постоянной части токена, а затем, судя по вашему примеру (не из спецификаций CSS), переменное количество пробелов, за которыми следует токен url. A переменное число пробелов [\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 с этим необходимо обрезать строку. Я не мог исключить пробелы из группы url, как из примера 4, однако должен соответствовать URL-адресу с пробелом в нем, и это не должно быть правильно, это примеры, как только у вас нет %20test4.gif файл

[Редактировать] Я предпочитаю следующую версию регулярных выражений

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

Он терпит больше пробельные

+0

Это полностью сработало для меня и спасло меня, возможно, час работы. Я сосать при написании регулярных выражений. Я знаю, как использовать их достаточно, чтобы не пострадать, но я ненавижу писать их. Спасибо djechelon! – racl101

1

Вы можете использовать ТОЛЬКО regexs? Ваша жизнь может быть намного проще, если вы использовали функции строки для удаления всех пробелов, тогда вы можете написать регулярное выражение, которое не должно беспокоиться об этом.

Вот быстрый один, не может работать очень хорошо:

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

Второй захват группа должна дать вам то, что вы хотите.

Следует, вероятно, заменить .* на класс символов, содержащий все символы, которые может содержать допустимый путь.

+0

Спасибо! Я использовал вторую часть в своем совпадении со строкой JS –

Смежные вопросы