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>
¿Fue útil?

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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top