¿Cuál es la mejor manera de seleccionar todo el texto entre 2 etiquetas? Por ejemplo: el texto entre todas las etiquetas 'pre' de la página.
html
regex
html-parsing
basheps
fuente
fuente
/<div>.*?<\/div>/.exec("<div><div></div></div>")
Respuestas:
Puede usar
"<pre>(.*?)</pre>"
, (reemplazando pre por el texto que desee) y extraer el primer grupo (para obtener instrucciones más específicas, especifique un idioma), pero esto supone la noción simplista de que tiene HTML muy simple y válido.Como han sugerido otros comentaristas, si está haciendo algo complejo, use un analizador HTML.
fuente
<pre>
etiquetas después de intentarlo<pre>(.*?)<\/pre>
, es porque está mirando lo que captura la coincidencia completa en lugar del grupo de captura (. *?). Suena cursi pero siempre pienso "paréntesis = par de ladrones" porque a menos que(
sea seguido por un?
como en(?:
o(?>
, cada partida tendrá dos capturas: 1 para la partida completa y 1 para el grupo de captura. Cada conjunto adicional de paréntesis agrega una captura adicional. Solo tiene que saber cómo recuperar ambas capturas en cualquier idioma con el que esté trabajando.La etiqueta se puede completar en otra línea. Por eso es
\n
necesario agregarlo.fuente
(.|\n)*?
cuando se trata con etiquetas HTML en varias líneas. La respuesta seleccionada solo funciona si las etiquetas HTML están en la misma línea.(.|\n)*?
para que coincida con ningún carácter. Utilice siempre.
con els
modificador (una línea). O una[\s\S]*?
solución alternativa./\*(.|\n)*?\*/
que hizo el trabajo - graciasEsto es lo que usaría.
Básicamente lo que hace es:
(?<=(<pre>))
La selección tiene que anteponerse con la<pre>
etiqueta(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
Esta es solo una expresión regular que quiero aplicar. En este caso, selecciona letra o dígito o carácter de nueva línea o algunos caracteres especiales enumerados en el ejemplo entre corchetes. El carácter de la tubería|
simplemente significa " O ".+?
Además de los estados de caracteres para seleccionar uno o más de los anteriores, el orden no importa. El signo de interrogación cambia el comportamiento predeterminado de "codicioso" a "no codicioso".(?=(</pre>))
La selección debe ser agregada por la</pre>
etiquetaDependiendo de su caso de uso puede que tenga que añadir algunos modificadores como ( i o m )
Aquí realicé esta búsqueda en Sublime Text para no tener que usar modificadores en mi expresión regular.
Javascript no es compatible con mirar atrás
El ejemplo anterior debería funcionar bien con lenguajes como PHP, Perl, Java ... Javascript, sin embargo, no admite mirar hacia atrás, por lo que debemos olvidarnos de usar
(?<=(<pre>))
y buscar algún tipo de solución alternativa. Tal vez simplemente elimine los primeros cuatro caracteres de nuestro resultado para cada selección, como aquí Texto de coincidencia de expresiones regulares entre etiquetasTambién mire la DOCUMENTACIÓN JAVASCRIPT REGEX para paréntesis sin captura
fuente
use el siguiente patrón para obtener contenido entre elementos. Reemplace
[tag]
con el elemento real del que desea extraer el contenido.Algunas veces las etiquetas tendrán atributos, como
anchor
tener etiquetashref
, luego use el patrón a continuación.fuente
<[tag]>
coincidirá<t>
,<a>
y<g>
Replace [tag] with the actual element you wish to extract the content from
papel.[]
deberían haberse omitido por completo. Eso sería más claro, debido a su significado en RegEx y al hecho, que las personas escanean el código primero y leen el texto después;)Para excluir las etiquetas delimitadoras:
(?<=<pre>)
busca texto después<pre>
(?=</pre>)
busca texto antes</pre>
Los resultados enviarán un mensaje de texto dentro de la
pre
etiquetafuente
No debería intentar analizar html con expresiones regulares, vea esta pregunta y cómo resultó.
En los términos más simples, html no es un lenguaje regular, por lo que no se puede analizar completamente con expresiones regulares.
Dicho esto, puede analizar subconjuntos de html cuando no hay etiquetas similares anidadas. Entonces, siempre que algo entre y no sea esa etiqueta en sí, esto funcionará:
Una mejor idea es usar un analizador, como el DOMDocument nativo, para cargar su html, luego seleccione su etiqueta y obtenga el html interno que podría verse así:
Y dado que este es un analizador adecuado, podrá manejar etiquetas de anidamiento, etc.
fuente
php
. No estoy seguro de cómo PHP entró en escena ...Prueba esto....
fuente
Esta parece ser la expresión regular más simple de todo lo que encontré
(?:<TAG>)
de los partidos([\s\S]*)
en blanco en las coincidencias(?:<\/TAG>)
de los partidosfuente
¡Esta respuesta supone soporte para mirar alrededor! Esto me permitió identificar todo el texto entre pares de etiquetas de apertura y cierre. Ese es todo el texto entre el '>' y el '<'. Funciona porque mirar alrededor no consume los caracteres que coincide.
(? <=>) ([\ w \ s] +) (? = </)
Lo probé en https://regex101.com/ usando este fragmento HTML.
Es un juego de tres partes: la mirada hacia atrás, el contenido y la mirada hacia el futuro.
Espero que sirva como un comienzo para 10. Suerte.
fuente
Como la respuesta aceptada es sin código javascript, entonces agregue eso:
fuente
preg_match_all(/<pre>([^>]*?)<\/pre>/,$content,$matches)
esta expresión regular seleccionará todo entre etiquetas. no importa si está en una nueva línea (trabajar con multilínea.fuente
En Python, establecer la
DOTALL
bandera capturará todo, incluidas las nuevas líneas.python example.py
Captura de texto entre todas las etiquetas de apertura y cierre en un documento
Para capturar texto entre todas las etiquetas de apertura y cierre en un documento,
finditer
es útil. En el siguiente ejemplo, tres<pre>
etiquetas de apertura y cierre están presentes en la cadena.python example2.py
fuente
Para múltiples líneas:
fuente
Puedes usar
Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
fuente
Yo uso esta solución:
fuente
En Javascript (entre otros), esto es simple. Cubre atributos y múltiples líneas:
fuente
fuente