Qual é a melhor maneira de selecionar todo o texto entre duas tags - ex: o texto entre todas as tags 'pré' na página.
html
regex
html-parsing
basheps
fonte
fonte
/<div>.*?<\/div>/.exec("<div><div></div></div>")
Respostas:
Você pode usar
"<pre>(.*?)</pre>"
(substituindo pre pelo texto que desejar) e extrair o primeiro grupo (para instruções mais específicas, especificar um idioma), mas isso pressupõe a noção simplista de que você tem HTML muito simples e válido.Como outros comentaristas sugeriram, se você estiver fazendo algo complexo, use um analisador de HTML.
fonte
<pre>
tags depois de tentar<pre>(.*?)<\/pre>
, é porque está vendo o que é capturado pela correspondência completa em vez do grupo de captura (. *?). Parece extravagante, mas eu sempre penso "parênteses = par de ladrões" porque, a menos que(
seja seguido por um?
como em(?:
ou(?>
, cada partida terá duas capturas: 1 para a partida completa e 1 para o grupo de captura. Cada conjunto adicional de parênteses adiciona uma captura adicional. Você só precisa saber como recuperar as duas capturas no idioma em que estiver trabalhando.A tag pode ser concluída em outra linha. É por isso que
\n
precisa ser adicionado.fonte
(.|\n)*?
ao lidar com tags HTML em várias linhas. A resposta selecionada funciona apenas se as tags HTML estiverem na mesma linha.(.|\n)*?
para combinar com qualquer caractere. Sempre use.
com os
modificador (linha única). Ou uma[\s\S]*?
solução alternativa./\*(.|\n)*?\*/
que fez o trabalho - obrigadoIsto é o que eu usaria.
Basicamente, o que faz é:
(?<=(<pre>))
A seleção deve ser precedida por uma<pre>
tag(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
Esta é apenas uma expressão regular que quero aplicar. Nesse caso, ele seleciona caracteres de letra ou dígito ou nova linha ou alguns caracteres especiais listados no exemplo entre colchetes. O caractere de pipe|
significa simplesmente " OU ".+?
Os estados de caracteres positivos para selecionar uma ou mais das ordens acima não importam. O ponto de interrogação altera o comportamento padrão de 'ganancioso' para 'ingrato'.(?=(</pre>))
A seleção deve ser anexada pela</pre>
tagDependendo do seu caso de uso, pode ser necessário adicionar alguns modificadores como ( i ou m )
Aqui eu realizei essa pesquisa no Sublime Text para não precisar usar modificadores no meu regex.
Javascript não suporta lookbehind
O exemplo acima deve funcionar bem com linguagens como PHP, Perl, Java ... No entanto, o Javascript não suporta lookbehind, portanto, precisamos esquecer o uso
(?<=(<pre>))
e procurar algum tipo de solução alternativa. Talvez simples tira os quatro primeiros caracteres do nosso resultado para cada seleção, como aqui Regex corresponde ao texto entre as tagsTambém olhar para o DOCUMENTAÇÃO JavaScript REGEX para parênteses não captura
fonte
use o padrão abaixo para obter conteúdo entre os elementos. Substitua
[tag]
pelo elemento real do qual você deseja extrair o conteúdo.Em algum momento, as tags terão atributos, como
anchor
taghref
, e então use o padrão abaixo.fonte
<[tag]>
irá corresponder<t>
,<a>
e<g>
Replace [tag] with the actual element you wish to extract the content from
parte.[]
deveriam ter sido omitidos por completo. Isso seria mais clara, por causa de seu significado em RegEx eo fato de que as pessoas digitalizar o código primeiro e ler o texto depois;)Para excluir as tags de delimitação:
(?<=<pre>)
procura texto depois<pre>
(?=</pre>)
procura texto antes</pre>
Os resultados serão inseridos na
pre
tagfonte
Você não deve tentar analisar html com expressões regulares, veja esta pergunta e como ela acabou.
Nos termos mais simples, o html não é uma linguagem comum, portanto você não pode analisar totalmente com expressões regulares.
Dito isto, você pode analisar subconjuntos de html quando não houver tags semelhantes aninhadas. Portanto, desde que algo entre e não seja essa tag em si, isso funcionará:
Uma idéia melhor é usar um analisador, como o DOMDocument nativo, para carregar seu html, selecione sua tag e obtenha o html interno que pode ser algo como isto:
E como esse é um analisador adequado, ele poderá manipular tags de aninhamento etc.
fonte
php
. Não sei como PHP entrou em cena ...Tente isso ....
fonte
Esta parece ser a expressão regular mais simples de tudo o que encontrei
(?:<TAG>)
das correspondências([\s\S]*)
em nas correspondências(?:<\/TAG>)
das correspondênciasfonte
Esta resposta supõe suporte para olhar ao redor! Isso me permitiu identificar todo o texto entre pares de tags de abertura e fechamento. Esse é todo o texto entre o '>' e o '<'. Funciona porque olhar ao redor não consome os caracteres correspondentes.
(? <=>) ([\ w \ s] +) (? = </)
Eu testei em https://regex101.com/ usando este fragmento HTML.
É um jogo de três partes: o olhar para trás, o conteúdo e o futuro.
Espero que sirva como ponto de partida para 10. Sorte.
fonte
Como a resposta aceita é sem código javascript, adicione isso:
fonte
preg_match_all(/<pre>([^>]*?)<\/pre>/,$content,$matches)
esse regex selecionará tudo entre a tag. não importa se está em nova linha (trabalhe com várias linhas.fonte
No Python, definir o
DOTALL
sinalizador capturará tudo, incluindo novas linhas.python example.py
Capturando texto entre todas as marcas de abertura e fechamento em um documento
Capturar texto entre todas as tags de abertura e fechamento de um documento
finditer
é útil. No exemplo abaixo, três<pre>
tags de abertura e fechamento estão presentes na string.python example2.py
fonte
Para várias linhas:
fonte
Você pode usar
Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
fonte
Eu uso esta solução:
fonte
Em Javascript (entre outros), isso é simples. Abrange atributos e várias linhas:
fonte
fonte