2008-11-06 2 views
3

Im пытаясь выработать регулярное выражение, которое возвращает только <link> тег hrefsRegEx для возврата атрибута 'href' только тегов '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> 

спасибо

+0

Пожалуйста, перефразируйте вопрос. Я не думаю, что кто-то поймет ваш вопрос в его нынешнем виде. – Rexxars 2008-11-06 11:24:22

ответ

3

Либо

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

или

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

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

+0

Отлично! Я бы никогда не выбрал это! – 2008-11-06 12:32:18

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

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

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

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

+1

это не работает – 2008-11-06 11:31:57

0

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

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

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

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

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

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

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

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

Возможно, ваше регулярное выражение не работает с утверждениями lookbehind. Обходной бы

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

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

1

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

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

Смежные вопросы