Vaya, ¡tu progreso es bastante bueno! La idea que tienes es muy buena, y el código original de
lasTabulaciones() se acerca, dando una idea de lo que quieres, aunque le hace falta un ligero ajuste.
El código original reemplaza toda la línea completa por el valor de
$HTML2, y esta cadena solo declara un elemento <span>. Lo que hace falta es, considerando el número de caracteres "\t" encontrados al principo de cada línea, agregar un número igual de elementos <span>. Esto sugiere el uso de algún ciclo.
Considera como ejemplo:
Código PHP:
function lasTabulaciones ($codigo) {
$hay = preg_match_all ('/^(\\t+)(.*)$/mi', $codigo, $resultado);
if(! $hay)
return $codigo . ' NADA';
// por cada linea con tabulaciones
for($i = 0; $i < count ($resultado[2]); $i++) {
// Inicialmente, $HTML comienza como el cuerpo de la linea
$HTML = $resultado[2][$i];
// Por cada tabulacion al comienzo de la linea, embeber $HTML
// en un elemento <span>
$n = strlen ($resultado[1][$i]);
for ($j = 0; $j < $n; $j++) {
$HTML = "<span style='padding-left:25px;'>" . $HTML . '</span>';
}
$codigo = str_replace ($resultado[0][$i], $HTML, $codigo);
}
return $codigo;
}
Algunos comentarios más sobre el código anterior:
- No es necesario diferenciar los nombres de las variables como $codigo2, $hay2, etc. ya que todas ellas son locales a la función.
- En la expresión regular, {1,} es equivalente a +.
- Es posible simplificar (.|\s) por ., ya que buscas coincidencias de cualquier caracter hasta el final de línea.
- Ya no es necesario que esa expresión sea no-codiciosa, así que puede expresarse como .* en lugar de .+?.
- Es más confiable usar el "anclaje" para determinar el final de línea en una expresión regular. En este caso, en lugar de la secuencia \r se usa el caracter $ al final de la expresión, y se usa el modificador 'm' para indicar que el procesamiento de la expresión sea multi-línea.
- De forma semejante, es bueno usar el anclaje al comienzo para indicar que las tabulaciones deben aparecer al comienzo de una línea. El caracter ^ al comienzo de la expresión tiene ese efecto.
- Volviendo a la función, no es necesaria la estructura de control else ya que el bloque del if contiene una sentencia return, así que en ese punto la función finalizaría y el resto del código no es ejecutado.
Espero que te sea de ayuda :).