RegEx, чтобы вернуть атрибут 'href' только для тегов 'link'? - PullRequest
3 голосов
/ 06 ноября 2008

Я пытаюсь создать регулярное выражение, которое возвращает только <link> тег hrefs

Почему это регулярное выражение возвращает все hrefs, включая

    (?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+
    <link rel="stylesheet" rev="stylesheet" 
    href="idlecore-tidied.css?T_2_5_0_228" media="screen">
    <a href="anotherurl">Slash Boxes</a>

спасибо

Ответы [ 5 ]

3 голосов
/ 06 ноября 2008

Или

/(?<=<link\b[^<>]*?)\bhref=\s*=\s*(?:"[^"]*"|'[^']'|\S+)/

или

/<link\b[^<>]*?\b(href=\s*=\s*(?:"[^"]*"|'[^']'|\S+))/

Основное отличие - [^<>]*? вместо .*?. Это потому, что вы не хотите, чтобы он продолжал поиск по другим тегам.

1 голос
/ 06 ноября 2008

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

Я получил хорошие результаты с <link\s+[^>]*(href\s*=\s*(['"]).*?\2) в Regex Coach с опциями s и g.

0 голосов
/ 06 ноября 2008

Какой вкус регулярного выражения вы используете? Perl, например, не поддерживает просмотр с переменной длиной. Где это вариант, я бы выбрал (отредактированный для реализации очень хорошей идеи из MizardX):

(?<=<link\b[^<>]*?)href\s*=\s*(['"])(?:(?!\1).)+\1

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

(?:<link\b[^<>]*?)(href\s*=\s*(['"])(?:(?!\2).)+\2)

\ 1 будет содержать ваш матч.

0 голосов
/ 06 ноября 2008
(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+

работает с Expresso (я думаю, что Expresso работает на .NET regex-engine). Вы могли бы даже уточнить это немного больше, чтобы соответствовать закрытию ' или "

(?<=<link\s+.*?)href\s*=\s*([\'\"])[^\'\"]+(\1)

Возможно, ваш regex-движок не работает с утверждениями, которые смотрят за спиной. Обходной путь будет

(?:<link\s+.*?)(href\s*=\s*([\'\"])[^\'\"]+(\2))

Ваш матч будет в захваченной группе 1.

0 голосов
/ 06 ноября 2008
/(?<=<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+[^>]*>/

Я немного шатался по обратным ссылкам, поэтому оставил это там Это регулярное выражение хотя:

/(<link\s+.*?)href\s*=\s*[\'\"][^\'\"]+[^>]*>/

... работает в моем тесте Javascript.

...