Negar grupos usando regex

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 iapó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).)