2015-08-24 1 views
-2

Мне нужно извлечь все ссылки на изображения в документе HTML. На самом деле я могу извлечь значение HREF атрибута с помощью этого RegExp:Регулярное выражение, чтобы найти атрибут href для HTML с расширением изображения

private static final String HTML_A_HREF_TAG_PATTERN = 
    "\\s*(?i)href\\s*=\\s*(\"([^\"]*\")|'[^']*'|([^'\">\\s]+))"; 

Мне нужно получить только ссылку на изображение, так что я должен проверить, если строка матч с расширением изображений (JPG, JPEG, PNG, GIF).

Как изменить шаблон?

+0

Неужели вы что-то пробовали? –

+0

Попробуйте это (в синтаксисе perl): 'href \ s * = \ s * ['"] ([^' "] +. (?: jpg | png | jpeg | gif)) ['"] ' – fronthem

+0

Пробуйте попытку это: http://codereview.stackexchange.com/questions/20126/regex-to-get-all-image-links –

ответ

0

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

<[^>]+href\s*=\s*['"]([^'"]+.(?:jpg|png|jpeg|gif))['"][^>]*> 

Объяснение

<[^>]+: открыт тег, который следует из любых символов, кроме закрывающего тэга >,

href\s*=\s*: Текст href следует из = символа,

['"]: открытая строка символы ' или ",

([^'"]+.(?:jpg|png|jpeg|gif)): строка сочиняет любой символов, кроме ' или " с расширением изображения,

['"]: символ закрытой строки ' или ",

[^>]*>: любая возможная строка до тесного тега.

Это очень похоже на ваше регулярное выражение, я не уверен, что этот может хорошо работать с Java или нет, но я уже пытался проверить его на онлайн-тесте Java regex.

+1

Спасибо, это сработало. – cesare

+0

Даже для регулярного выражения использование '[^>]' само по себе является плохим способ выполнить это. Соответствует '', но не '' Возможно, даже не попытайтесь сделать тег синтаксический разбор – sln

+0

'<(?!\!--)[^>] + href \ s * = \ s * ['"] ([^' "] +. (?: jpg | png | jpeg | gif)) ['"] [^>] *> ' может быть помощь. – fronthem

3

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

В вашем случае, вы могли бы использовать JSoup пройти через HTML исходного код страницы и обработать необходимую информацию, в соответствии с приведенным ниже примером (адаптировано из here):

Document doc = Jsoup.connect(url).get(); 
    Elements media = doc.select("[src]"); 

    Pattern imageExt = Pattern.compile("((jpe?g)|(png)|(gif))$"); 
    for(Element src : media) { 
     Matcher m = imageExt.matcher(src.attr("abs:src")); 
     if(m.find()) { 
      System.out.println(src.attr("abs:src")); 
     } 

    } 
1

Отказ от ответственности - для анализа html с регулярным выражением является не рекомендуется!

Хотя это несовершенно, это может сработать. Ссылка находится в группе захвата 2.

# "(?si)<[\\w:]+(?=(?:[^>\"']|\"[^\"]*\"|'[^']*')*?(?<=\\s)href\\s*=\\s*(?:(['\"])\\s*((?:(?!\\1).)*?\\.(?:jpg|png|jpeg|gif))\\s*\\1))\\s+(?:\".*?\"|'.*?'|[^>]*?)+>" 

(?si) 
< [\w:]+ 
(?= 
     (?: [^>"'] | " [^"]* " | ' [^']* ')*? 
     (?<= \s) 
     href \s* = \s* 
     (?: 
      (['"])      # (1) 
      \s* 
      (       # (2 start) 
       (?: 
        (?! \1) 
        . 
       )*? 
       \. 
       (?: jpg | png | jpeg | gif) 
      )        # (2 end) 
      \s* 
      \1 
    ) 
) 
\s+ 
(?: " .*? " | ' .*? ' | [^>]*?)+ 
> 
Смежные вопросы