Parece que el primer ejemplo no está completo. Podía ser mejor decir qué transformaciones necesitas hacer con el "XML". Me parece que quieres arreglar tags como "<NumeroDe La Su>". Eso se podía hacer con
Using perl Syntax Highlighting
$lin =~ s{<(/)?([\w-]+[^\w<>-][^<>]*)(/)?>}{
my ($pre,$tag,$post) = ($1,$2,$3);
$tag =~ s/[^\w-]+//g;
"<$pre$tag$post>"
}ges;
my ($pre,$tag,$post) = ($1,$2,$3);
$tag =~ s/[^\w-]+//g;
"<$pre$tag$post>"
}ges;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Este código aprovecha la posibilidad de especificar no sólo una cadena de caracteres como el substituto, pero también (con /e) un trozo de código. Y este trozo se ejecuta cada vez que el regexp encuentra un match.
Otra cosa que pareces necesitar es añadir algunos \n. Detrás de cada <tag/> o </tag>:
Using perl Syntax Highlighting
Si también quieres entre los tags como "<TAG67><TAG68>" o mejor dicho, entre cada "><" excepto a "<TagA></TagA>" puedes usar esto:
Using perl Syntax Highlighting
o
Using perl Syntax Highlighting
$lin =~ s{><([^/])}{>\n<$1}gs;
1 while $lin =~ s{(</[^/]+>)</}{$1\n</}gs;
1 while $lin =~ s{(</[^/]+>)</}{$1\n</}gs;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
No sé qué será más rápido. Pon tu ojo a Benchmark.pm para poder medir que solución es mejor.
¿Se requiere alguna transformación más? :-)