Estou tentando pesquisar em meu projeto por <a>
elementos que não possuem seu href
atributo, usando uma expressão regular para corresponder aos resultados que estou procurando.
Primeiro tentei a seguinte expressão: /<a (?!href).*?>/
Isso funciona para muitos elementos, mas falha assim que o href não é o primeiro atributo. Eu então tentei, <a .*?(?!href).*?>
mas isso também falhou, pois a .*?
expressão era muito gananciosa, apesar de adicionar o ?
para ter certeza de que *
era preguiçoso.
o que estou perdendo? O conjunto de teste que estou usando é o seguinte:
<a href=""></a>
<a href=""" data-toggle="tab" ></a>
<a data-toggle="tab" href="foobar"></a>
<a data-toggle="tab" type=""asdf>test</a>
<a test="test"></a>
Apenas os dois últimos hiperlinks devem corresponder à minha pesquisa.
Esteja ciente de que sua resposta não corresponde:
<a alt="href"></a>
<a style"newhref"></a>
por exemplo.Demonstração e explicação
Eu usaria o padrão Tempered Greedy :
<a(?:(?!\bhref=)[^>])*>
Demonstração e explicação
Acontece que descobri o que estava fazendo de errado enquanto digitava minha pergunta.
A razão
.*?
não funcionou foi porque continuou combinando interminavelmente antes da previsão negativa. Ao passar.*?
para o lookahead negativo, consegui fazê-lo funcionar:Incluir o quantificador zero ou mais na antecipação negativa o torna parte do texto que não quero corresponder, sem que ele corresponda ao texto antes que a antecipação negativa possa chegar a ele. Obrigado ao Toto por me lembrar de adicionar um
=
para não ignorar valores de atributo contendo "href"!