Здравствуйте!

Не пинайте, если не там создал топик, просто не знаю где спросить. Вроде были такие темы...
Помогите пожалуйста с регулярными выражениями (regexpr - http://regexpstudio.com/ )
Мне нужно вытянуть из исходного кода веб страницы, путь к favicon.ico (название иконки может быть иным)
Вот примеры строк вытянутых с разных сайтов:

1. <link rel="shortcut icon"
                         href="http://www.domaintools.com/favicon.ico" />

2. <link rel="SHORTCUT ICON" href="/favicon.ico" />

3. <link href="http://templates.33b.ru/33b.ru/favicon.ico" rel="shortcut icon">

4. <link rel="icon" href="http://www.avangate.com/favicon.ico" type="image/x-icon"/>

5. <link rel="shortcut icon" href="/images/plimus_wave.ico" />

6. <LINK REL="SHORTCUT ICON" href="/favicon.ico">

7. <link rel="shortcut icon" type="image/ico" href="/images/favicon.gif" />

8. <link href="favicon.ico" rel="shortcut icon">

9. <LINK REL="shortcut icon" HREF="../favicon.ico" TYPE="image/x-icon">

10. <link type="image/x-icon" href="http://www.alexa.com/favicon.ico" rel="icon">

11. <link rel="shortcut icon" type="image/ico" href="http://solsie.com/wp-content/themes/Peace/favicon.ico" />

Как видно, все они чем-то отличаются, но и многим похожи. Так вот мне нужно получить то что находится между кавычками HREF="*******"
Мне самому удалось кое что сделать, но не работает для всех приведенных примеров.

(?i)<link rel="(shortcut icon|icon)"\s*(href)="(.*?.ico)"(.| \r|\n)*?>

Помогите создать универсальное регулярное выражение чтобы работала во всех возможных вариантах

Если не трудно. то скажите как этот самый href попадает в строку? Просто тут люди, видимо, привыкли, что "строка = регулярное выражение"... :)

Не знаю на чём нужно писать ваше выражение, но если то что вы дали сохранить в файл test, то выделить ссылки получается bash-скриптом с использованием sed, например, так:

cat test | sed -e s/'.\+[Hh][Rr][Ee][Ff]="\([^"]\+\)".\+'/'\1'/g

(кроме примера 1, разбитого на две строки, если бы их склеить в одну - работало бы)
Суть - выражение .\+[Hh][Rr][Ee][Ff]="\([^"]\+\)".\+ заменяется на \1 ,т.е. на запомненное в скобках выражение [^"]\+\

Переводя на "русский": находим строку, в которой идут .\+ (любое количество любых символов), затем href независимо от регистра, затем =", затем [^"]\+ (любое количество любых символов кроме "), это выражение запоминается в скобках \( \), затем идёт ".\+ (кавычки любое количество любых символов) и заменяем эту строку на \1 - то что запомнили, т.е. выражение между двумя "
На php на preg_replace должно быть что-то похожее

AnalogXP пишет

(?i)<link rel="(shortcut icon|icon)"\s*(href)="(.*?.ico)"(.| \r|\n)*?>

Для какого диалекта регулярных выражений?

Хорошая новость: вышла книжка Джефри Фридла про регулярные выражения, третье издание. Плохая новость: дорого.

Для Perl 5/PCRE

Выделить код

Код:

<link[ \t]+[^<>\n\r]*(?:rel="(?:shortcut )?icon"[^<>\n\r]*[ \t]+href="([^<>\n\r"]*)"|href="([^<>\n\r"]*)"[^<>\n\r]*[ \t]+rel="(?:shortcut )?icon")[^<>\n\r]*/?>

флаги mi