Ver Mensaje Individual
  #7 (permalink)  
Antiguo 25/06/2005, 06:14
leonardop
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
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 :).