Регулярное выражение для получения атрибута из тега HTML

Я ищу регулярное выражение, которое может получить тег src (case insensitive) из следующих HTML-фрагментов в java.

<html><img src="kk.gif" alt="text"/></html>
<html><img src='kk.gif' alt="text"/></html>
<html><img src = "kk.gif" alt="text"/></html>

Ответы

Ответ 1

Одна возможность:

String imgRegex = "<img[^>]+src\\s*=\\s*['\"]([^'\"]+)['\"][^>]*>";

- возможность (если совпадение не учитывается). Это немного беспорядок, и сознательно игнорирует случай, когда цитаты не используются. Чтобы представить его, не беспокоясь о стихах строк:

<img[^>]+src\s*=\s*['"]([^'"]+)['"][^>]*>

Это соответствует:

  • <img
  • один или несколько символов, которые не являются > (то есть возможны другие атрибуты)
  • src
  • необязательные пробелы
  • =
  • необязательные пробелы
  • начальный разделитель ' или "
  • источник изображения (который может не содержать одиночную или двойную кавычку)
  • окончательный разделитель
  • хотя выражение может остановиться здесь, я добавил:
    • ноль или более символов, которые не являются > (более возможные атрибуты)
    • >, чтобы закрыть тег

Примечания:

  • Если вы хотите включить src=, переместите открытую скобку влево: -)
  • Это не касается балансировки разделителя или значений атрибутов без разделителей, а также может захлебываться от плохо сформированных атрибутов (таких как атрибуты, которые включают > или источники изображений, которые включают ' или ").
  • Анализ HTML с регулярными выражениями, как это, является нетривиальным и, в лучшем случае, быстрым взломом, который работает в большинстве случаев.

Ответ 2

Этот вопрос здесь очень много.

Регулярные выражения - это плохой способ решения этой проблемы. Сделайте себе одолжение и используйте какой-либо HTML-парсер.

Регулярные выражения размыты для разбора HTML. Вы получите сложное выражение, которое будет вести себя неожиданно в некоторых случаях, которые будут иметь место в противном случае.

Изменить: Если ваш HTML-код прост, то:

Pattern p = Pattern.compile("src\\s*=\\s*([\\"'])?([^ \\"']*)");
Matcher m = p.matcher(str);
if (m.find()) {
  String src = m.group(2);
}

И есть любое количество парсеров Java HTML.

Ответ 3

Этот ответ для поисковиков Google, потому что он слишком поздно

Копирование cletus показало ошибку и Модифицировав его ответ и передав измененную строку src\\s*=\\s*([\"'])?([^\"']*) в качестве параметра, переданного в Pattern.compile, работал у меня,

Вот полный пример

    String htmlString = "<div class=\"current\"><img src=\"img/HomePageImages/Paris.jpg\"></div>"; //Sample HTML

    String ptr= "src\\s*=\\s*([\"'])?([^\"']*)";
    Pattern p = Pattern.compile(ptr);
    Matcher m = p.matcher(htmlString);
    if (m.find()) {
        String src = m.group(2); //Result
    }

Ответ 4

Вы имеете в виду src-атрибут img-Tag? В этом случае вы можете пойти со следующим:

<[Ii][Mm][Gg]\\s*([Ss][Rr][Cc]\\s*=\\s*[\"'].*?[\"'])

Это должно сработать. Выражение src= '...' находится в скобках, поэтому оно является группой-разделителем и может обрабатываться отдельно.