Получить URL-адрес изображений в файле CSS с помощью Java?

Я пытаюсь получить URL-адреса для изображений (все типы MIME) в удаленном файле CSS с помощью Java.

Я использую jsoup для получения URL-адреса css.

После бесчисленных часов изучения парсера CSS я не смог разобраться из-за отсутствия документации.

Я также посмотрел на некоторые другие протекторы, но они меня еще больше запутали:

Я также видел несколько примеров использования регулярных выражений, но я не слишком хорошо знаком с тем, как реализовать его в java.

У кого-нибудь есть предложения о том, как решить эту проблему?


person pbojinov    schedule 21.11.2011    source источник
comment
Попробуйте парсер CSS   -  person Michael Mior    schedule 21.11.2011
comment
Вам нужно следовать рекурсивным ссылкам на другие файлы CSS? Вы можете использовать регулярное выражение, чтобы найти все вхождения url().   -  person Sam Barnum    schedule 21.11.2011
comment
Да, в конечном итоге мне нужно получить ссылки на другие файлы CSS. Какое регулярное выражение найдет все вхождения url()?   -  person pbojinov    schedule 21.11.2011
comment
На самом деле мне удалось получить содержимое файла CSS, используя простой код URL-адреса Java, так что будет следующим шагом в сопоставлении всех .jpg, .gif, .png и других возможных MIME внутри файла CSS   -  person pbojinov    schedule 21.11.2011
comment
([^\s]+(\.(?i)(jpg|png|gif|bmp))$) работает, теперь просто нужна реализация Java, чтобы передать файл css в виде строки и найти все URL-адреса изображений   -  person pbojinov    schedule 21.11.2011


Ответы (2)


В Java вы должны использовать Pattern и Matcher из java.util.regex пакет.

Вы компилируете свой шаблон, затем создаете экземпляр своего сопоставления со своей строкой, а затем ищете все, что соответствует вашему шаблону.

Pattern p = Pattern.compile("...");
Matcher m = p.matcher("your CSS file as a String");
while (m.find()) {
  // Here use m.group(), m.group(1), ...
}

Спецификация CSS 2.1 гласит:

Формат значения URI: 'url(', за которым следует необязательный пробел, за которым следует необязательный символ одинарной кавычки (') или двойной кавычки ("), за которым следует сам URI, за которым следует необязательная одинарная кавычка (') или двойная кавычка. ("), за которым следует необязательный пробел, за которым следует ')'. Два символа кавычек должны быть одинаковыми.

Таким образом, вы можете использовать регулярное выражение, подобное этому:

url\(\s*(['"]?+)(.*?)\1\s*\)

.*? не является жадным, позволяя вам брать столько символов, сколько необходимо. Притяжательный квантификатор позволяет избежать возврата в ['"]?+.

person Ludovic Kuty    schedule 24.11.2011
comment
очень красиво, вы попали прямо в точку. код, который я написал, почти такой же, за исключением регулярного выражения, которое я собираюсь протестировать прямо сейчас. Просто хотел уточнить, что он будет соответствовать всему, что находится между '' внутри круглых скобок, верно? url('domain/link/images/graphic.png'); вернет domain.../graphic.png - person pbojinov; 25.11.2011
comment
Да, он вернет его во второй соответствующей группе. - person Ludovic Kuty; 25.11.2011

Вы также можете использовать для этого ph-css. См. пример «Посетить все URL-адреса, содержащиеся в CSS», расположенный по адресу https://github.com/phax/ph-css#code-examples. проще некуда :)

person Philip Helger    schedule 16.05.2013
comment
Привет, как я могу посещать только URL-адреса изображений, а не все URL-адреса? - person Idan; 17.08.2013
comment
Это не просто возможно, потому что для синтаксического анализатора URL-адрес является URL-адресом - возможно, вы можете выбрать суффикс URL-адреса. Если он заканчивается на .jpg или .gif, то это изображение... - person Philip Helger; 19.08.2013
comment
В качестве альтернативы вы можете проверить, есть ли declaration.getProperty ().equals ("background-image") и т. д. (объявление является вторым параметром onUrlDeclaration) - person Philip Helger; 19.08.2013