tag español attribute html regex html-parsing

html - español - RegEx para eliminar todas las marcas entre las etiquetas<a y</a> excepto dentro de



title html español (9)

¿Cómo es esto?

(?<=nggallery/sid=xx]">).*(?=<//a>)

Utilice global y una línea como modificadores (-g y -s). Esto hace coincidir todo entre <a href="[nggallery id=xx]"> y </a> . No estoy seguro si entendí su problema correctamente o no ... pero este RegEx hace lo que acabo de describir.

Tratar de descubrir una expresión regular me da un calambre en el cerebro :)

Estoy reemplazando miles de enlaces href individuales con un shortcode individual en el contenido de publicación de WordPress usando un complemento que me permite ejecutar expresiones regulares en el contenido.

En lugar de intentar combinar una consulta SQL con un RegEx, lo hago en dos etapas: primero el SQL para encontrar / reemplazar cada URL individual al shortcode individual, y la segunda etapa, eliminar el resto del enlace ''href` margen.

Estos son algunos ejemplos de lo que tengo ahora desde el primer paso; Como puede ver, la URL se ha reemplazado con el [nggallery id=xxx] .

<a href="[nggallery id=xx]"><span class="shutterset"> <img class="alignnone size-large wp-image-23067" title="Image Title" src="http://example.com/wp-content/uploads/2015/06/image-title.jpg" alt="" width="685" height="456" /></span></a> <a href="[nggallery id=xxxxx]">Click here!</a> <a title="title title" href="[nggallery id=xxx]" target="_blank">Title Link Title Link</a>

Ahora, necesito eliminar todo el marcado del enlace href - span , img , etc - entre el <a y el final </a> , dejando solo el shortcode [nggallery id=xxx] .

Tengo un comienzo aquí: https://www.regex101.com/r/rL8wP1/2

Pero no sé cómo evitar que el [nggallery id=xxx] sea ​​capturado en el RegEx.

Actualización 07/09/2015

La respuesta de @ nhahtdh parece funcionar perfectamente, no es demasiado codiciosa y no come enlaces html adyacentes. Use ( y ) como delimitadores y $1 como reemplazo con un complemento de expresiones regulares en WordPress. (Si usa BBEdit, necesitará usar /1 )

( <a/s[^>]*"(/[nggallery[^/]]*/])".*?<//a> )

Actualización 07/02/2015

Gracias a Fab Sa (respuesta a continuación) , su expresión regular en https://www.regex101.com/r/rL8wP1/4

<a.*(/[nggallery[^/]+]*/]).*?<//a>

funciona en el emulador regex101, pero cuando se usa en el editor de texto BBEdit o en el complemento de WordPress que ejecuta regex, su regex elimina el [nggallery id=***] . Entonces, ¿es demasiado codicioso? Algún otro problema?

Actualización 01/07/2015:

Lo sé, lo sé, re: RegEx coinciden con las etiquetas abiertas excepto las etiquetas autocontenidas con XHTML NO PUEDES PARSE HTML CON REGEX


Aquí hay una expresión regular que coincide perfectamente con sus ejemplos.

(<a.*?href=")|([^/]]*?<//a>)

En lugar de tratar de hacer coincidir la expresión completa a la vez, usé el operador OR para especificar dos expresiones regulares, una para el inicio de la etiqueta a, <a.*?href=" y otra para el final de la etiqueta a [^/]]*?<//a> . Esto puede o no funcionar en una sola operación de reemplazo, si no, dividirlo en dos operaciones de reemplazo, primero ejecute el uno para la expresión regular de la etiqueta final, luego ejecute el uno para el start-tag. Déjeme saber si tiene algún ejemplo adicional que rompa esta respuesta.


Dado que no ha especificado, supongo que no hay etiquetas de anclaje anidadas, y simplemente desea extraer el código entre corchetes que se encuentra allí. También asumo que el formato de identificación de su código es "[nggallery".

Encontrar usando este

</s*a(?=/s|>)[^>]*?(/[nggallery[^/]]+/])[^>]*>(.|/n)+?(</s*///s*a/s*>)

SUSTITUYA utilizando

/1

(que debería ser la primera notación de grupo capturada para BBEdit)


Es cierto que no puede analizar html con expresiones regulares, ¿qué hay de hacer que el comportamiento sea a prueba de balas con un analizador lexer minimalista? Le daría mucha más flexibilidad y control sobre su código.

<?php $src = <<<EOF <a href="[nggallery id=xx]"><span class="shutterset"> <img class="alignnone size-large wp-image-23067" title="Image Title" src="http://example.com/wp-content/uploads/2015/06/image-title.jpg" alt="" width="685" height="456" /></span></a> <a href="[nggallery id=xxxxx]">Click here!</a> <a title="title title" href="[nggallery id=xxx]" target="_blank">Title Link Title Link</a> EOF; // we "eat up" the source string by opening <a> tags, closing <a> tags or text $tokens = array(); while ($src){ // check if $src begins with this pattern <a (any optional prop)[nggallery (any string)] (any optional prop)> if (preg_match(''/^<a [^>]*(/[nggallery [^/]]+/])[^>]*>/s'', $src, $match)){ // here you can handle data with more flexibility // you can grab the id or the [placeholder] via //$match[1] = [nggallery id=xyz] // we store the chunk of string and label it as an opening tag $tokens[] = array(''type'' => ''OPENING_A'', ''value'' => $match[0]); }else if (preg_match(''/^<//a>/s'', $src, $match)){ // we store the chunk of string and label it as a closing tag $tokens[] = array(''type'' => ''CLOSING_A'', ''value'' => $match[0]); }else if (preg_match(''/^./s'', $src, $match)){ // we store the chunk of string, in this case a character and label it as text $tokens[] = array(''type'' => ''TEXT'', ''value'' => $match[0]); } // finally we remove the identified pattern from the source string // and continue "eating it up" $src = substr($src, strlen($match[0])); } // once the source string has been consumed, we get this array // var_dump($tokens); // array (size=247) // 0 => // array (size=2) // ''type'' => string ''OPENING_A'' (length=9) // ''value'' => string ''<a href="[nggallery id=xx]">'' (length=28) // 1 => // array (size=2) // ''type'' => string ''TEXT'' (length=4) // ''value'' => string ''<'' (length=1) // 2 => // array (size=2) // ''type'' => string ''TEXT'' (length=4) // ''value'' => string ''s'' (length=1) // 3 => // array (size=2) // ''type'' => string ''TEXT'' (length=4) // ''value'' => string ''p'' (length=1) // ... ommited for brevity // now with all the parsed data, we can rebuild the html // as needed $html = ''''; // we keep a flag to now if we are inside a tag // marked with ngggallery $insideNGGalleryTag = false; foreach ($tokens as $token){ if ($token[''type''] == ''OPENING_A''){ $insideNGGalleryTag = true; $html .= $token[''value'']; }else if ($token[''type''] == ''CLOSING_A''){ $insideNGGalleryTag = false; $html .= $token[''value'']; }else{ // if we are inside a nggallery tag, we will ignore // all text inside it. here you could also remove // html properties from the tag, move the [nggallery placeholder] // inside the <a> or some other behavior you might need if (!$insideNGGalleryTag){ $html .= $token[''value'']; } } } // finally echo or write to file the // modified html, in this case it would return var_dump($html); // <a href="[nggallery id=xx]"></a> // <a href="[nggallery id=xxxxx]"></a> // <a title="title title" href="[nggallery id=xxx]" target="_blank"></a>


La expresión regular de Fab Sa <a.*(/[nggallery[^/]+]*/]).*?<//a> traga todo cuando hay varias etiquetas <a> en una sola línea, debido a que no está restringido .* al principio, que coincidirá con diferentes etiquetas <a> .

Al restringir los caracteres permitidos, puede coincidir de alguna manera con lo que desea:

<a/s[^>]*"(/[nggallery[^/]]*/])".*?<//a> ^^^^^^^

Forcé al menos un espacio en blanco después de a para asegurarme de que no coincida con otras etiquetas, más algunas restricciones adicionales.

De todos modos, estás solo si descubres que no funciona en algún caso de esquina. En general, es una mala idea manipular HTML con expresiones regulares.


No sé por qué quiere hacer esto usando expresiones regulares, cuando puede hacerse usando manipulaciones DOM de JavaScript.

Te mostraré la forma básica, para darte una idea:

var div = document.createElement(''div''); div.innerHTML = yourString; var a = div.querySelector(''a''); document.body.innerHTML = a.attributes[0].nodeValue;

Violín de trabajo

También puedes ver el documentFragment


Poco tarde para esto, pero pensé que iba a tirar esto en la mezcla.
(Nota: ¡advertencia! Esto puede ser difícil de ver ...)

modificado : para BBEdit.
Nota: BBEdit utiliza el motor PCRE. Se pueden encontrar construcciones regex BBEdit
Aquí: https://gist.github.com/ccstone/5385334

Formateado:

# (?s)(<a(?=/s)(?>(?:(?<=/s)href/s*=/s*"/s*(/[nggallery/s+id/s*=/s*[^"/]>]*?/])"|".*?"|''.*?''|[^>]*?)+>)(?<!/>)(?(2)|(?!))).*?</a/s*> (?s) ( # (1 start), Capture open a tag <a # Open a tag (?= /s ) (?> # Atomic (?: (?<= /s ) href /s* = /s* # href attribute " /s* ( # (2 start), Capture shortcode value /[nggallery /s+ id /s* = /s* [^"/]>]*? /] ) # (2 end) " | " .*? " | '' .*? '' | [^>]*? )+ > ) (?<! /> ) # Not a self contained closure (?(2) # Only a tags with href attr, shortcode value | (?!) ) ) # (1 end) .*? # Stuff inbetween </a /s* > # Close a tag

Salida:

** Grp 0 - ( pos 0 , len 240 ) <a href="[nggallery id=xx]"><span class="shutterset"> <img class="alignnone size-large wp-image-23067" title="Image Title" src="http://example.com/wp-content/uploads/2015/06/image-title.jpg" alt="" width="685" height="456" /></span></a> ** Grp 1 - ( pos 0 , len 28 ) <a href="[nggallery id=xx]"> ** Grp 2 - ( pos 9 , len 17 ) [nggallery id=xx] ---------------- ** Grp 0 - ( pos 244 , len 46 ) <a href="[nggallery id=xxxxx]">Click here!</a> ** Grp 1 - ( pos 244 , len 31 ) <a href="[nggallery id=xxxxx]"> ** Grp 2 - ( pos 253 , len 20 ) [nggallery id=xxxxx] ----------------- ** Grp 0 - ( pos 294 , len 90 ) <a title="title title" href="[nggallery id=xxx]" target="_blank">Title Link Title Link</a> ** Grp 1 - ( pos 294 , len 65 ) <a title="title title" href="[nggallery id=xxx]" target="_blank"> ** Grp 2 - ( pos 323 , len 18 ) [nggallery id=xxx]


Puedes usar este regex

<a.*(/[nggallery[^/]+]*/]).*?<//a>

a nivel mundial (bandera g ). Esta expresión regular coincidirá con un enlace y guardará la parte [nggallery ...] . Puede sustituir el partido completo por $ 1 para mantener la parte guardada [nggallery ...] .

He actualizado su expresión regular en línea: https://www.regex101.com/r/rL8wP1/4

PD: en esta solución [nggallery ...] no necesita estar en un atributo específico como href . Si quiere forzar eso, puede usar <a.*href/="(/[nggallery[^/]+]*/])".*?<//a>


/<a/b[^>]*href/s*=/s*"(/[nggallery id=[^"]+/])".*?<//a>/i

Eso colocará el código corto [nggallery id=XXX] en el grupo 1, luego reemplazará la coincidencia con el contenido del grupo 1.

NOTA: esto supone un HTML con un formato razonable, se aplican los descargos habituales.