Na realidade
<img src="imgtag.gif" alt="<img>" />
não é HTML válido e também não é XML válido.
Não é um XML válido porque os '<' e '>' não são caracteres válidos dentro das sequências de atributos. Eles precisam ser escapados usando as entidades XML correspondentes & lt; e & gt;
Também não é HTML válido porque o formulário de fechamento curto não é permitido em HTML (mas está correto em XML e XHTML). A tag 'img' também é uma tag implicitamente fechada, conforme a especificação HTML 4.01. Isso significa que o fechamento manual está realmente errado e é equivalente a fechar qualquer outra tag duas vezes.
A versão correta em HTML é
<img src="imgtag.gif" alt="<img>">
e a versão correta em XHTML e XML é
<img src="imgtag.gif" alt="<img>"/>
O exemplo a seguir que você deu também é inválido
<
tag
attr="5"
/>
Este também não é um HTML ou XML válido. O nome da tag deve estar logo atrás do '<', embora os atributos e o fechamento '>' possam estar onde quiserem. Portanto, o XML válido é realmente
<tag
attr="5"
/>
E aqui está outro mais engraçado: você pode realmente optar por usar "ou" como seu atributo entre aspas
<img src="image.gif" alt='This is single quoted AND valid!'>
Todos os outros motivos postados estão corretos, mas o maior problema com a análise de HTML é que as pessoas geralmente não entendem todas as regras de sintaxe corretamente. O fato de seu navegador interpretar seu grupo de tags como HTML não significa que você realmente escreveu HTML válido.
Edit: E mesmo stackoverflow.com concorda comigo sobre a definição de válido e inválido. Seu XML / HTML inválido não está destacado, enquanto minha versão corrigida é.
Basicamente, o XML não é feito para ser analisado com regexps. Mas também não há razão para fazê-lo. Existem muitos analisadores XML para cada idioma. Você pode escolher entre analisadores SAX, DOM e Pull. É garantido que tudo isso é muito mais rápido que a análise com um regexp e, em seguida, você pode usar tecnologias legais como XPath ou XSLT na árvore DOM resultante.
Minha resposta é, portanto: não apenas é difícil analisar XML com regexps, mas também é uma má idéia. Basta usar um dos milhões de analisadores XML existentes e aproveitar todos os recursos avançados do XML.
HTML é muito difícil de tentar analisar sozinho. Primeiro, a sintaxe legal possui muitas pequenas sutilezas das quais você pode não estar ciente e, em segundo lugar, o HTML em estado selvagem é apenas uma pilha enorme e fedorenta de (você entendeu). Há uma variedade de bibliotecas de analisador lax que fazem um bom trabalho no manuseio de HTML como uma sopa de tags, basta usá-las.