Buscar y reemplazar el contenido de texto de una etiqueta
Pregunta
Estoy tratando de rellenar específicamente los / 's en el texto de una etiqueta.
1234/1234/ABCDE => 1234 / 1234 / ABCDE
En contexto; si tengo una etiqueta:
<a href="http://www.domain.com/path/to/page.html">12 34/1234A/BC DEFG</a>
Me gustaría obtener:
<a href="http://www.domain.com/path/to/page.html">12 34 / 1234A / BC DEFG</a>
Solución
Este Regex debería hacer el truco:
(\s*/\s*(?=[^<>]+<))
Solo reemplazará el '/'
dentro de las etiquetas y no las URL.
En C #:
myHtml = Regex.Replace(myHtml, @"(\s*/\s*(?=[^<>]+<))", " / ");
En Perl:
$myHtml =~ s!(\s*/\s*(?=[^<>]+<))! / !g;
En JavaScript:
myHtml = myHtml.replace(/(\s*\/\s*(?=[^<>]+<))/g, " / ");
Nota:
en estos ejemplos, todo el documento debe cargarse en la cadena myHtml
.
Si trabaja en una sola línea a la vez, obviamente no funcionará si hay nuevas líneas dentro de las etiquetas o pares de etiquetas intermedios.
Otros consejos
Este no es realmente el tipo de cosa que hacen las expresiones regulares. Probablemente sea mejor usar un analizador HTML o XML: crea un árbol de nodos a partir del documento y luego puede pasar por todos los nodos de texto que están dentro de las etiquetas y agregar espacios según sea necesario.
Si lo necesita, puede intentar usar una expresión regular para extraer el texto entre dos etiquetas y luego procesarlo y luego volver a insertarlo, pero esta tarea es probablemente más complicada que una sola expresión regular debido a sus restricciones.
Aquí hay algo en Perl que funciona (pero no usa expresiones regulares):
my (@a, $in_tag);
foreach(split //, $string) { # assuming $string holds our string
$in_tag = 1 if Si lo necesita, puede intentar usar una expresión regular para extraer el texto entre dos etiquetas y luego procesarlo y luego volver a insertarlo, pero esta tarea es probablemente más complicada que una sola expresión regular debido a sus restricciones.
Aquí hay algo en Perl que funciona (pero no usa expresiones regulares):
<*>
Sin embargo, esto no es una expresión regular, sino un analizador muy simple.
eq "<";
$in_tag = 0 if Si lo necesita, puede intentar usar una expresión regular para extraer el texto entre dos etiquetas y luego procesarlo y luego volver a insertarlo, pero esta tarea es probablemente más complicada que una sola expresión regular debido a sus restricciones.
Aquí hay algo en Perl que funciona (pero no usa expresiones regulares):
<*>
Sin embargo, esto no es una expresión regular, sino un analizador muy simple.
eq ">";
if( Si lo necesita, puede intentar usar una expresión regular para extraer el texto entre dos etiquetas y luego procesarlo y luego volver a insertarlo, pero esta tarea es probablemente más complicada que una sola expresión regular debido a sus restricciones.
Aquí hay algo en Perl que funciona (pero no usa expresiones regulares):
<*>
Sin embargo, esto no es una expresión regular, sino un analizador muy simple.
eq "/" and not $in_tag) {
push @a, " ", "/", " ";
}
else {
push @a, Si lo necesita, puede intentar usar una expresión regular para extraer el texto entre dos etiquetas y luego procesarlo y luego volver a insertarlo, pero esta tarea es probablemente más complicada que una sola expresión regular debido a sus restricciones.
Aquí hay algo en Perl que funciona (pero no usa expresiones regulares):
<*>
Sin embargo, esto no es una expresión regular, sino un analizador muy simple.
;
}
}
$string = join "", @a;
Sin embargo, esto no es una expresión regular, sino un analizador muy simple.
Creo que aquí nos falta un poco de contexto. ¿Son los datos HTML, XML o solo fragmentos de texto con etiquetas?
Si es HTML o XML, como se menciona a menudo, las expresiones regulares no son seguras, a menos que usted controle exactamente el formato de los datos y sepa que siempre lo controlará. Y usted lo documenta.
Yo usaría un analizador adecuado si fuera usted. Si tiene Perl y XML :: Twig instalados, la siguiente línea de una línea lo hará:
perl -MXML::Twig -e'XML::Twig->parse( keep_spaces => 1, "my_file.xml")->subs_text( "/", " / ")->print'
Si está tratando con XML bien formado sin comentarios y sin secciones de CDATA, entonces una forma más eficiente sería usar PYX (necesita instalar XML :: PYX):
pyx my_file.xml | perl -p -e's{/}{ / }g if m{-}' | pyxw
¿Qué idioma?
En Perl, intente s / \ // \ / / g
.