html - sobre - Regex selecciona todo el texto entre las etiquetas
texto en html (11)
¿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?
Esto es lo que usaría.
(?<=(<pre>))(/w|/d|/n|[().,/-:;@#$%^&*/[/]"''+–///®°⁰!?{}|`~]| )+?(?=(</pre>))
Básicamente lo que hace es:
(?<=(<pre>))
selección debe preceder con <pre>
etiqueta <pre>
(/w|/d|/n|[().,/-:;@#$%^&*/[/]"''+–///®°⁰!?{}|~]| )
Esto es solo una expresión regular que deseo 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 los personajes 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 codificado''.
(?=(</pre>))
selección debe adjuntarse mediante la etiqueta <pre>
Dependiendo de su caso de uso, es posible que necesite agregar algunos modificadores como ( i o m )
- i - no distingue entre mayúsculas y minúsculas
- m - búsqueda multilínea
Aquí realicé esta búsqueda en Sublime Text, así que no tuve que usar modificadores en mi expresión regular.
Javascript no es compatible con lookbehind
El ejemplo anterior debería funcionar bien con lenguajes como PHP, Perl, Java ... Javascript, sin embargo, no es compatible con lookbehind así que tenemos que olvidarnos de usar (?<=(<pre>))
y buscar algún tipo de solución. . Tal vez simplemente quite los primeros cuatro caracteres de nuestro resultado para cada selección como aquí. Texto de coincidencia Regex entre etiquetas
También mire la DOCUMENTACIÓN DE REGEX JAVASCRIPT para paréntesis que no capturan
La etiqueta se puede completar en otra línea. Esta es la razón por la cual /n
necesita ser agregado.
<PRE>(.|/n)*?<//PRE>
No debería intentar analizar html con expresiones regulares, vea esta pregunta y cómo resultó.
En términos simples, html no es un lenguaje regular, por lo que no se puede analizar completamente con expresiones regulares.
Una vez dicho esto, puede analizar subconjuntos de html cuando no hay etiquetas similares anidadas. Entonces, mientras haya algo entre y no sea esa etiqueta, funcionará:
preg_match("/<([/w]+)[^>]*>(.*?)<///1>/", $subject, $matches);
$matches = array ( [0] => full matched string [1] => tag name [2] => tag content )
Una mejor idea es usar un analizador sintáctico, como el DOMDocument nativo, para cargar su html, luego seleccione su etiqueta y obtenga el html interno que podría verse más o menos así:
$obj = new DOMDocument();
$obj -> load($html);
$obj -> getElementByTagName(''el'');
$value = $obj -> nodeValue();
Y dado que este es un analizador apropiado, podrá manejar etiquetas de anidación, etc.
Para líneas múltiples:
<htmltag>(.+)((/s)+(.+))+</htmltag>
Prueba esto....
(?<=/<any_tag/>)(/s*.*/s*)(?=/<//any_tag/>)
Puede usar "<pre>(.*?)</pre>"
, (reemplazando pre con el texto que desee) y extraer el primer grupo (para instrucciones más específicas, especifique un idioma) pero esto asume la noción simplista de que tiene HTML muy simple y válido.
Como otros comentaristas han sugerido, si estás haciendo algo complejo, usa un analizador HTML.
Puede usar Pattern pattern = Pattern.compile( "[^<''tagname''/>]" );
Yo uso esta solución:
preg_match_all( ''/<((?!<)(.|/n))*?/>/si'', $content, $new);
var_dump($new);
usa el patrón de abajo para obtener contenido entre los elementos. Reemplace [tag] con el elemento real del que desea extraer el contenido
<[tag]>(.+?)</[tag]>
Las etiquetas de algún tiempo tendrán atributos como la etiqueta de anclaje que tenga href, luego use el siguiente
<[tag][^>]*>(.+?)</[tag]>
var str = "Lorem ipsum <pre>text 1</pre> Lorem ipsum <pre>text 2</pre>";
str.replace(/<pre>(.*?)<//pre>/g, function(match, g1) { console.log(g1); });
Dado que la respuesta aceptada no tiene el código de javascript, entonces agregue eso:
<pre>([/r/n/s]*(?!</w+.*[//]*>).*[/r/n/s]*|/s*[/r/n/s]*)<code/s+(?:class="(/w+|/w+/s*.+)")>(((?!<//code>)[/s/S])*)<//code>[/r/n/s]*((?!</w+.*[//]*>).*|/s*)[/r/n/s]*<//pre>