Eu estava ajudando um amigo com um pequeno plugin wordpress quando me deparei com um problema. Eu estava usando regex para pegar a primeira imagem do post e usá-la como miniatura. A questão é: o regex não estava certo e estava ignorando todas as imagens e pegando um URL iframe dentro da postagem. Então, depois de pensar em como fazer isso, encontrei uma solução;
O que eu tive que fazer?
Pegue o atributo src dentro de uma tag de imagem, independentemente da posição do atributo.
O que eu estava fazendo errado?
Por alguma razão, minha primeira regex só obteria o atributo src se fosse ANTES do atributo de estilo que o WP estava gerando para a imagem.
Como resolver
Primeiro, vamos iniciar o regex:
/<img /i
Então, eu encontraria todas as tags de imagem. A seguir, vamos negar tudo que não seja um src:
/<img (?:(?!src).)+/i
A (?:(?!src).)
significa algo como “Get tudo em seu caminho até que você bata uma seqüência que partidas src
;
Eu, então, procederia para extrair normalmente o valor do atributo:
/<img (?:(?!src).)+src="([^"]+)/i
Os "([^"]+)
meios “Grab tudo até encontrar uma citação”. O i
após a própria regex, caso você não saiba, significa que a pesquisa deve ser insensÃvel a maiúsculas e minúsculas (ou seja: não deve fazer distinção entre maiúsculas ou minúsculas)
tl; dr: Se você precisar negar um grupo / string inteiro usando regex, basta usar (?:(?!your string).)