Você não pode analisar [X] HTML com regex. Porque o HTML não pode ser analisado pelo regex. Regex não é uma ferramenta que pode ser usada para analisar corretamente o HTML. Como já respondi às perguntas sobre HTML e regex aqui tantas vezes antes, o uso do regex não permitirá que você consuma HTML. Expressões regulares são uma ferramenta que não é suficientemente sofisticada para entender as construções empregadas pelo HTML. HTML não é uma linguagem regular e, portanto, não pode ser analisado por expressões regulares. As consultas Regex não estão equipadas para dividir o HTML em suas partes significativas. tantas vezes, mas isso não está me afetando. Mesmo expressões regulares irregulares aprimoradas, usadas pelo Perl, não têm a tarefa de analisar o HTML. Você nunca vai me fazer rachar. HTML é uma linguagem de complexidade suficiente que não pode ser analisada por expressões regulares. Mesmo Jon Skeet não pode analisar HTML usando expressões regulares. Toda vez que você tenta analisar HTML com expressões regulares, a criança profana chora o sangue de virgens, e hackers russos usam seu aplicativo da web. A análise de HTML com regex convoca almas contaminadas para o reino dos vivos. HTML e regex andam juntos como amor, casamento e infanticídio ritual. O <center> não pode aguentar, é tarde demais. A força de regex e HTML juntos no mesmo espaço conceitual destruirá sua mente como uma massa aquosa. Se você analisa HTML com regex, está cedendo a Eles e seus modos blasfemos que nos condenam a um trabalho desumano por Aquele cujo Nome não pode ser expresso no Plano Multilíngue Básico, ele chega. O HTML-mais-regexp irá liquefazer os sentimentos do senciente enquanto você observa, sua psique murcha no ataque de horror.É tarde demais É tarde demais Não podemos ser salvos A trangessão de uma criança garante que o regex consumirá todo o tecido vivo (exceto o HTML que não pode, como profetizado anteriormente) Caro senhor, ajude-nos como alguém pode sobreviver a esse flagelo usando o regex para analisar O HTML condenou a humanidade a uma eternidade de terríveis torturas e brechas de segurança, usando o rege x como uma ferramenta para processar o HTML estabelece uma brecha entre este mundo e o mundo das terríveis entidades corrompidas (como entidades SGML, mas mais corruptas), um mero vislumbre de o mundo da reg ex analisadores para HTML irá ins tantly transporte ap consciência de rogrammer i nto aw orl d de incessante gritando, ele vem, O pestilento sl wil ithy regex-infecção l devorar sua HT ML analisador, aplicação e existência de todos os tempos, como Visual Basic só que pior vier, com es não fi ght h e vem, oi s Unholy Radiance de stro҉ying toda a iluminação, HTML tags de vazamento fr̶ǫm yo ur olhos como liq uid p ain, a canção de Regular exp re análise ssion vai EXTI nguish as vozes de mor homem tal do sp aqui eu posso vê-lo você pode ver ele é bonito t ele f inal snuf
fing o f a mentira é do homem tudo está perdido a LL I SLOST th e pônei ele vir s ele COM es ele co me s t ele ich ou permeat es al l MEU FAC E MINHA CARA ᵒh deus n o NO NOO O ON Θ parada t ele um * ̶͑̾̾ GL ES ͎a̧͈͖r̽̾̈́͒͑e
n ot Rè̡͊͠͝aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ T O͇̹̺ͅƝ̴ȳ̳ TH̘ Ë͖́̉ ͠P̯͍̭O̚ N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝ S̨̥̫͎̭ͯ̿̔̀ͅ
Você já tentou usar um analisador XML?
Nota do Moderador
Esta postagem está bloqueada para evitar edições inadequadas no seu conteúdo. A postagem parece exatamente como deveria - não há problemas com seu conteúdo. Por favor, não sinalize para a nossa atenção.
Embora o HTML arbitrário com apenas uma regex seja impossível, às vezes é apropriado usá-los para analisar um conjunto limitado e conhecido de HTML.
Se você tiver um pequeno conjunto de páginas HTML das quais deseja coletar dados e depois colocar em um banco de dados, as expressões regulares poderão funcionar bem. Por exemplo, recentemente queria obter os nomes, partidos e distritos dos representantes federais australianos, que saí do site do Parlamento. Este foi um trabalho limitado e único.
Regexes funcionou muito bem para mim e foram muito rápidos de configurar.
fonte
&foo;
codificações eCDATA
seções? Usando um minificador HTML para remover todos os espaços em branco do documento que o navegador não renderiza? Um analisador XML não se importa, e nem uma declaração XPath bem escrita. Um "analisador" baseado em regex, por outro lado ...<font>
etc .: sem classes ou IDs para ajudar a navegar no DOM. Depois de lutar o dia inteiro com a abordagem "certa", eu finalmente mudei para uma solução regex e a trabalhei em uma hora.Eu acho que a falha aqui é que HTML é uma gramática Chomsky Tipo 2 (gramática livre de contexto) e RegEx é uma gramática Chomsky Tipo 3 (gramática regular) . Como uma gramática do tipo 2 é fundamentalmente mais complexa do que uma gramática do tipo 3 (consulte a hierarquia de Chomsky ), é matematicamente impossível analisar o XML com o RegEx.
Mas muitos tentarão, alguns até reivindicarão sucesso - mas até outros encontrarem a falha e estragar tudo.
fonte
A -> s A e
). (X) HTML não possui essa propriedade em uma tag inicial: uma tag inicial não pode conter outras tags iniciais. O subconjunto que o OP está tentando analisar não é um CFG.Não dê ouvidos a esses caras. Você pode analisar totalmente gramáticas sem contexto com regex se você dividir a tarefa em partes menores. Você pode gerar o padrão correto com um script que execute cada uma delas em ordem:
Ainda não terminei a última parte, mas sei que estou chegando perto. Ele continua jogando
CthulhuRlyehWgahnaglFhtagnException
s por algum motivo, então eu vou portá-lo para o VB 6 e usá-loOn Error Resume Next
. Vou atualizar o código assim que investigar essa porta estranha que acabou de se abrir na parede. Hmm.PS Pierre de Fermat também descobriu como fazê-lo, mas a margem em que ele estava escrevendo não era grande o suficiente para o código.
fonte
Isenção de responsabilidade : use um analisador, se tiver a opção. Dito isto...
Este é o regex que eu uso (!) Para corresponder às tags HTML:
Pode não ser perfeito, mas eu executei esse código através de um muito HTML. Note que ele até captura coisas estranhas como
<a name="badgenerator"">
, que aparecem na web.Acho que, para não corresponder às tags independentes, você pode querer usar o look-behind negativo de Kobi :
ou apenas combine se e se não estiver.
Para downvoters: Este é um código de trabalho de um produto real. Duvido que alguém que leia esta página tenha a impressão de que é socialmente aceitável usar expressões regulares em HTML.
Advertência : devo observar que esse regex ainda se decompõe na presença de blocos CDATA, comentários e elementos de script e estilo. A boa notícia é que você pode se livrar daqueles que usam um regex ...
fonte
<!doctype html><title><</title>
.'<!doctype html><title><</title>'.match(/<(?:"[^"]*"['"]*|'[^']*'['"]*|[^'">])+>/g)
Retornos simples["<!doctype html>", "<title>", "<</title>"]
enquanto deveria["<title>", "</title>"]
.Há pessoas que lhe dirão que a Terra é redonda (ou talvez a Terra seja um esferóide oblato, se quiserem usar palavras estranhas). Eles estão mentindo.
Há pessoas que lhe dirão que as expressões regulares não devem ser recursivas. Eles estão limitando você. Eles precisam subjugar você e o fazem mantendo-o na ignorância.
Você pode viver na realidade deles ou tomar a pílula vermelha.
Como Lord Marshal (ele é um parente da classe Marshal .NET?), Eu vi o Regex-Verse com base na pilha
underversee retornei com conhecimentos depoderes quevocê não pode imaginar. Sim, acho que havia um ou dois antigos protegendo-os, mas eles estavam assistindo futebol na TV, então não foi difícil.Eu acho que o caso XML é bastante simples. O RegEx (na sintaxe .NET), desinflado e codificado em base64 para facilitar a compreensão por sua mente débil, deve ser algo como isto:
As opções a serem definidas são
RegexOptions.ExplicitCapture
. O grupo de captura que você está procurando éELEMENTNAME
. Se o grupo de capturaERROR
não estiver vazio, ocorreu um erro de análise e o Regex parou.Se você tiver problemas para convertê-lo em um regex legível por humanos, isso deve ajudar:
Se você não tiver certeza, não, não estou brincando (mas talvez esteja mentindo). Vai funcionar. Criei toneladas de testes de unidade para testá-lo e até usei (parte) dos testes de conformidade . Como um tokenizador, não um analisador completo, ele só dividirá o XML em seus tokens de componente. Não analisará / integrará DTDs.
Ah ... se você quiser o código fonte da regex, com alguns métodos auxiliares:
regex para tokenizar um xml ou o regex comum completo
fonte
No shell, você pode analisar o HTML usando sed :
Relacionado (por que você não deve usar a correspondência de regex):
fonte
Concordo que a ferramenta certa para analisar XML e especialmente HTML é um analisador e não um mecanismo de expressão regular. No entanto, como outros já apontaram, algumas vezes o uso de um regex é mais rápido, fácil e o trabalho é feito se você souber o formato dos dados.
A Microsoft, na verdade, possui uma seção de Práticas recomendadas para expressões regulares no .NET Framework e fala especificamente sobre Considerar a fonte de entrada .
Expressões regulares têm limitações, mas você considerou o seguinte?
A estrutura .NET é única quando se trata de expressões regulares, pois oferece suporte a definições de grupo de balanceamento .
Por esse motivo, acredito que você PODE analisar o XML usando expressões regulares. Observe, no entanto, que ele deve ser XML válido (os navegadores perdoam muito o HTML e permitem uma sintaxe XML ruim dentro do HTML ). Isso é possível, pois a "Definição do grupo de balanceamento" permitirá que o mecanismo de expressão regular atue como um PDA.
Citação do artigo 1 citado acima:
Considere a seguinte expressão regular:
Use as bandeiras:
Expressão regular explicada (em linha)
Você pode tentar isso em A Better .NET Regular Expression Tester .
Eu usei a fonte de amostra de:
Isso encontrou a correspondência:
embora realmente tenha saído assim:
Por fim, gostei muito do artigo de Jeff Atwood: Parsing Html The Cthulhu Way . Engraçado o suficiente, ele cita a resposta a essa pergunta que atualmente tem mais de 4k votos.
fonte
System.Text
não faz parte do c #. Faz parte do .NET.(?=<ul\s*id="matchMe"\s*type="square"\s*>) # match start with <ul id="matchMe"...
), entre "<ul" e "id" deve ser\s+
, não\s*
, a menos que você quer que ele corresponder <ulid = ...;)\s+
vez de\s*
.<img src="images/pic.jpg" />
/
lugar dentro que falhou no seu<img src="images/pic.jpg" />
html.Sugiro usar o QueryPath para analisar XML e HTML em PHP. É basicamente a mesma sintaxe do jQuery, mas é do lado do servidor.
fonte
Embora as respostas que você não pode analisar HTML com regexes estejam corretas, elas não se aplicam aqui. O OP só deseja analisar uma tag HTML com expressões regulares, e isso é algo que pode ser feito com uma expressão regular.
A regex sugerida está errada, no entanto:
Se você adicionar algo ao regex, ao voltar atrás, ele poderá ser forçado a corresponder a coisas tolas como
<a >>
,[^/]
é permissivo demais. Observe também que<space>*[^/]*
é redundante, porque[^/]*
também pode corresponder a espaços.Minha sugestão seria
Onde
(?<! ... )
está (em expressões regulares do Perl) o aspecto negativo. Ele lê "a <, então uma palavra, então qualquer coisa que não seja>, a última das quais pode não ser a /, seguida por>".Observe que isso permite coisas como
<a/ >
(assim como o regex original); portanto, se você quiser algo mais restritivo, precisará criar um regex para corresponder aos pares de atributos separados por espaços.fonte
>
caractere. Concordo que o OP sugere que pode ser feito com uma regex, mas a apresentada aqui é muito simplista.Tentar:
É semelhante ao seu, mas o último
>
não deve ser após uma barra e também aceitah1
.fonte
>
símbolo foi corretamente escapado para o & gt ;.>
é válido em um valor de atributo. De fato, na serialização 'XML canônico' você não deve usar>
. (Que não é totalmente relevante, exceto para enfatizar que>
em um valor de atributo não é de todo uma coisa incomum.)<div title="this tag is a <div></div>">hello</div>
Sun Tzu, um antigo estrategista, general e filósofo chinês, disse:
Nesse caso, seu inimigo é HTML e você é você ou regex. Você pode até ser Perl com regex irregular. Conheça HTML. Conheça a si mesmo.
Eu compus um haiku descrevendo a natureza do HTML.
Também compus um haiku descrevendo a natureza da regex no Perl.
fonte
Resultado:
Basicamente, apenas defina os nomes dos nós dos elementos que se fecham automaticamente, carregue toda a cadeia html em uma biblioteca DOM, pegue todos os elementos, faça um loop e filtre os que não estão se fechando automaticamente e operam neles.
Tenho certeza que você já sabe que não deve usar regex para esse fim.
fonte
NS
e especifique o espaço para nome.Eu não sei sua necessidade exata disso, mas se você também estiver usando o .NET, não poderia usar o Html Agility Pack ?
Excerto:
fonte
Você deseja que o primeiro
>
não seja precedido por a/
. Olha aqui detalhes sobre como fazer isso. É conhecido como lookbehind negativo.No entanto, uma implementação ingênua disso acabará correspondendo
<bar/></foo>
neste documento de exemploVocê pode fornecer um pouco mais de informação sobre o problema que está tentando resolver? Você está iterando pelas tags programaticamente?
fonte
O W3C explica a análise em um formato pseudo-regexp:
W3C Link
Siga os links var para
QName
,S
eAttribute
para obter uma imagem mais clara.Com base nisso, você pode criar uma regexp muito boa para lidar com coisas como remover tags.
fonte
Se você precisar disso para PHP:
O DOM do PHP funções não funcionarão corretamente, a menos que sejam XML formatado corretamente. Não importa quão melhor seja o seu uso para o resto da humanidade.
simplehtmldom é bom, mas eu achei um pouco complicado, e é bastante memória pesada [Vai travar em páginas grandes.]
Eu nunca usei querypath , por isso não posso comentar sobre sua utilidade.
Outro a tentar é o meu DOMParser que é muito leve em relação aos recursos e estou usando felizmente há algum tempo. Simples de aprender e poderoso.
Para Python e Java, links semelhantes foram publicados.
Para os que recusaram - eu escrevi minha classe apenas quando os analisadores XML se mostraram incapazes de suportar o uso real. A votação religiosa apenas impede que respostas úteis sejam publicadas - mantenha as coisas dentro da perspectiva da pergunta, por favor.
fonte
Aqui está a solução:
Para testá-lo profundamente, digitei as tags de fechamento automático da string, como:
Também inseri tags com:
Se você encontrar algo que não funcione na prova de conceito acima, estou disponível na análise do código para melhorar minhas habilidades.
<EDIT> Esqueci que a pergunta do usuário era evitar a análise de tags de fechamento automático. Nesse caso, o padrão é mais simples, transformando-se no seguinte:
O @ridgerunner usuário notou que o padrão não permite que atributos não cotadas ou atributos sem valor . Nesse caso, um ajuste fino nos traz o seguinte padrão:
</EDIT>
Compreendendo o padrão
Se alguém estiver interessado em aprender mais sobre o padrão, forneço uma linha:
Dica pequena: para analisar melhor esse código, é necessário examinar o código-fonte gerado, pois não forneci caracteres especiais HTML escapando.
fonte
<option selected>
. Também não corresponde a tags válidas com valores de atributos não citados, ou seja<p id=10>
.< a href="http://wtf.org" >
tenho certeza de que é legal, mas você não combina.Sempre que preciso extrair rapidamente algo de um documento HTML, uso o Tidy para convertê-lo em XML e depois XPath ou XSLT para obter o que eu preciso. No seu caso, algo como isto:
fonte
Eu usei uma ferramenta de código aberto chamada HTMLParser antes. Ele foi projetado para analisar o HTML de várias maneiras e serve muito bem ao objetivo. Ele pode analisar o HTML como um código de árvore diferente e você pode facilmente usar sua API para obter atributos fora do nó. Confira e veja se isso pode ajudá-lo.
fonte
Eu gosto de analisar HTML com expressões regulares. Não tento analisar HTML idiota que está deliberadamente quebrado. Este código é meu analisador principal (edição Perl):
É chamado htmlsplit, divide o HTML em linhas, com uma tag ou parte do texto em cada linha. As linhas podem ser processadas ainda mais com outras ferramentas de texto e scripts, como grep , sed , Perl, etc. Eu nem estou brincando :) Aproveite.
É simples o suficiente para rejeitar meu script Perl slurp-everything-first em uma boa coisa de streaming, se você deseja processar enormes páginas da web. Mas não é realmente necessário.
Aposto que vou ser votado por isso.
Divisão HTML
Contra a minha expectativa, isso teve alguns votos positivos, então vou sugerir algumas expressões regulares melhores:
Eles são bons para XML / XHTML.
Com pequenas variações, ele pode lidar com HTML confuso ... ou converter o HTML -> XHTML primeiro.
A melhor maneira de escrever expressões regulares é no estilo Lex / Yacc , não como linhas opacas ou monstruosidades comentadas com várias linhas. Ainda não fiz isso aqui; esses mal precisam disso.
fonte
/(\w+)="(.*?)"/
assume aspas duplas. Ele perderá valores entre aspas simples. Na versão html 4 e no valor anterior não citado é permitido, se for uma palavra simples./(\w+)="(.*?)"/
pode corresponder falsamente ao texto que se parece com um atributo dentro de um atributo, por exemplo<img title="Nope down='up' for aussies" src="..." />
. Se aplicado globalmente, também corresponderá a essas coisas no texto comum ou nos comentários html.Aqui está um analisador baseado em PHP que analisa HTML usando algum regex ímpio. Como autor deste projeto, posso dizer que é possível analisar HTML com regex, mas não é eficiente. Se você precisar de uma solução do lado do servidor (como eu fiz para o meu plugin wp-Typography WordPress ), isso funcionará.
fonte
Existem algumas boas expressões para substituir o HTML pelo BBCode aqui . Para todos os que pensam mal, observe que ele não está tentando analisar completamente o HTML, apenas para higienizá-lo. Ele provavelmente pode se dar ao luxo de eliminar tags que seu simples "analisador" não consegue entender.
Por exemplo:
fonte
Sobre a questão dos métodos RegExp para analisar (x) HTML, a resposta para todos que falaram sobre alguns limites é: você não foi treinado o suficiente para governar a força dessa arma poderosa, já que NINGUÉM aqui falou sobre recursão .
Um colega independente de RegExp me notificou essa discussão, que certamente não é a primeira na web sobre esse tópico antigo e popular.
Depois de ler algumas postagens, a primeira coisa que fiz foi procurar a string "? R" neste segmento. O segundo foi pesquisar sobre "recursão".
Não, vaca sagrada, nenhuma correspondência encontrada.
Como ninguém mencionou o mecanismo principal no qual um analisador é construído, logo percebi que ninguém entendia o ponto.
Se um analisador HTML (x) precisar de recursão, um analisador RegExp sem recursão não será suficiente para esse fim. É uma construção simples.
A arte negra do RegExp é difícil de dominar , portanto, talvez haja outras possibilidades que deixamos de fora ao testar e testar nossa solução pessoal para capturar toda a web em uma mão ... Bem, tenho certeza disso :)
Aqui está o padrão mágico:
Apenas tente.
Ele é escrito como uma string PHP, então o modificador "s" faz com que as classes incluam novas linhas.
Aqui está um exemplo de nota no manual do PHP que escrevi em janeiro: Referência
(Cuidado, nessa nota, usei incorretamente o modificador "m"; ele deve ser apagado, apesar de ser descartado pelo mecanismo RegExp, pois não foi usada nenhuma ancoragem ^ ou $).
Agora, poderíamos falar sobre os limites desse método de um ponto de vista mais informado:
De qualquer forma, é apenas um padrão RegExp, mas revela a possibilidade de desenvolver muitas implementações poderosas.
Eu escrevi esse padrão para alimentar o analisador de descida recursiva de um mecanismo de modelo que construí em minha estrutura, e os desempenhos são realmente ótimos, tanto em tempos de execução quanto no uso de memória (nada a ver com outros mecanismos de modelo que usam a mesma sintaxe).
fonte
Como muitas pessoas já apontaram, o HTML não é uma linguagem comum, o que pode dificultar a análise. Minha solução para isso é transformá-lo em uma linguagem comum usando um programa organizado e, em seguida, usar um analisador XML para consumir os resultados. Existem muitas boas opções para isso. Meu programa é escrito usando Java com a biblioteca jtidy para transformar o HTML em XML e, em seguida, o Jaxen para xpath no resultado.
fonte
As partes explicadas:
<
: personagem inicial\s*
: pode ter espaços em branco antes do nome da tag (feio, mas possível).(\w+)
: as tags podem conter letras e números (h1). Bem,\w
também corresponde a '_', mas não dói, eu acho. Se curioso, use ([a-zA-Z0-9] +).[^/>]*
: qualquer coisa, exceto>
e/
até fechar>
>
: fechamento>
NÃO RETIRADO
E aos colegas que subestimam as expressões regulares dizendo que são tão poderosos quanto as línguas comuns:
um n ba n ba n que não é regular e nem mesmo livre de contexto, pode ser combinado com
^(a+)b\1b\1$
Backreferencing FTW !
fonte
O(MN)
(M sendo comprimento de expressão regular, N sendo comprimento de texto). As referências anteriores são uma das causas disso. A implementação no awk não tem referências anteriores e corresponde a tudo dentro doO(MN)
tempo.Se você está simplesmente tentando encontrar essas tags (sem ambições de análise), tente esta expressão regular:
Escrevi em 30 segundos e testei aqui: http://gskinner.com/RegExr/
Ele corresponde aos tipos de tags que você mencionou, enquanto ignora os tipos que você disse que deseja ignorar.
fonte
\/>
vez de\\>
.\>
é exatamente o que eu quis dizer; Nunca pretendi editar a expressão regular da minha postagem original.\/
, pois isso faria exatamente o oposto dos requisitos. Talvez eu tenha pensado que você estava oferecendo um padrão de filtro negativo.Parece-me que você está tentando combinar tags sem um "/" no final. Tente o seguinte:
fonte
É verdade que, ao programar, geralmente é melhor usar analisadores e APIs dedicados em vez de expressões regulares ao lidar com HTML, especialmente se a precisão é primordial (por exemplo, se o seu processamento pode ter implicações de segurança). No entanto, não atribuo a uma visão dogmática de que a marcação no estilo XML nunca deve ser processada com expressões regulares. Há casos em que expressões regulares são uma ótima ferramenta para o trabalho, como ao editar edições únicas em um editor de texto, corrigir arquivos XML quebrados ou lidar com formatos de arquivos que parecem, mas não são, completamente XML. Há alguns problemas a serem observados, mas eles não são intransponíveis ou mesmo necessariamente relevantes.
Uma regex simples como
<([^>"']|"[^"]*"|'[^']*')*>
geralmente é boa o suficiente, em casos como os que acabei de mencionar. É uma solução ingênua, considerando todas as coisas, mas permite corretamente>
símbolos não codificados nos valores dos atributos. Se você estiver procurando, por exemplo, umatable
etiqueta, poderá adaptá-la como</?table\b([^>"']|"[^"]*"|'[^']*')*>
.Apenas para dar uma idéia de como seria uma regex HTML mais "avançada", o seguinte faz um trabalho bastante respeitável de emular o comportamento do navegador do mundo real e o algoritmo de análise HTML5:
A seguir, uma definição bastante estrita de tags XML (embora não represente o conjunto completo de caracteres Unicode permitidos nos nomes XML):
É verdade que isso não explica o contexto circundante e alguns casos extremos, mas mesmo essas coisas poderiam ser tratadas se você realmente quisesse (por exemplo, pesquisando entre as correspondências de outra regex).
No final do dia, use a ferramenta mais apropriada para o trabalho, mesmo nos casos em que essa ferramenta for uma regex.
fonte
Embora não seja adequado e eficaz usar expressões regulares para esse fim, às vezes expressões regulares fornecem soluções rápidas para problemas simples de correspondência e, na minha opinião, não é tão horrível usar expressões regulares para trabalhos triviais.
Há um post definitivo no blog sobre a correspondência de elementos HTML mais internos, escritos por Steven Levithan.
fonte