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.