RegEx для возврата атрибута 'href' только из тегов 'link'?

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

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

    (?<= <Ссылка \ S +. *?) HREF \ s * = \ с * [\ '\ "] [^ \' \"] +
    
    Слэш-боксы

благодарю вас

5 ответов

Решение

Или

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

или же

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам