function PintarHTML($Texto) { $_Debug = false; // El primer paso es separar todas las etiquetas en un array $Texto = str_replace(' ', ' ', $Texto); // Re-emplazo tabuladores $Texto = str_replace('&', '&', $Texto); // Re-emplazo simbolos AND $TamTexto = strlen($Texto); $PalabraActual = ""; $Estado = ""; // Puede ser : PHP, JavaScript_Inicio, JavaScript_Str1, JavaScript_Str2, JavaScript_Fin, // CSS_Inicio, CSS_Str1, CSS_Str2, CSS_Fin, Etiqueta, Etiqueta_Str1, Etiqueta_Str2, // Comentario, Estilo_Str1, Estilo_Str2 $TextoColoreado = ""; $InicioEtiqueta = 0; $InicioEstilo = 0; for ($i = 0; $i < $TamTexto; $i++) { switch ($Estado) { case "": // Sin estado if ($Texto[$i] == "<") { // Posible etiqueta abierta if (substr($Texto, $i, 7) == "<script") { // JavaScript $TextoColoreado .= $PalabraActual; $PalabraActual = "<span class='Codigo_Marron'><script"; $Estado = "JavaScript_Inicio"; $i += 6; } else { if (substr($Texto, $i, 6) == "<style") { // CSS $TextoColoreado .= $PalabraActual; $PalabraActual = "<span class='Codigo_Lila'><style"; $Estado = "CSS_Inicio"; $i += 5; } else { if (substr($Texto, $i, 5) == "<?php") { // PHP $TextoColoreado .= $PalabraActual; $PalabraActual = "<?php "; $Estado = "PHP"; $i += 5; } else { if (substr($Texto, $i, 4) == "<!--") { // Comentario $TextoColoreado .= $PalabraActual; $PalabraActual = "<span class='Codigo_Gris'><!--"; $Estado = "Comentario"; $i += 4; } else { // Otras etiquetas $TextoColoreado .= $PalabraActual; $PalabraActual = "<"; $Estado = "Etiqueta"; $InicioEtiqueta = $i + 1; } } } } } else { $PalabraActual .= $Texto[$i]; } break; // -[FIN devildrey33.PintarHTML1]- // -[INICIO devildrey33.PintarHTML2]- // Estado : String con comillas simples dentro de una etiqueta // -[FIN devildrey33.PintarHTML1]- // -[INICIO devildrey33.PintarHTML2]- // Estado : String con comillas simples dentro de una etiqueta case "Etiqueta_Str1": if (_FinString1($Texto, $i) == true) { $PalabraActual .= "'</span>"; $Estado = "Etiqueta"; } else { $PalabraActual .= $Texto[$i]; } break; // Estado : String con comillas dobles dentro de una etiqueta // Estado : String con comillas dobles dentro de una etiqueta case "Etiqueta_Str2": if (_FinString2($Texto, $i) == true) { $PalabraActual .= '"</span>'; $Estado = "Etiqueta"; } else { $PalabraActual .= $Texto[$i]; } break; // Estado : dentro de una etiqueta // Estado : dentro de una etiqueta case "Etiqueta": if ($Texto[$i] == ">") { // Final de la etiqueta $Color = _BuscarEtiqueta(substr($Texto, $InicioEtiqueta, $i - $InicioEtiqueta)); $TextoColoreado .= "<span class='" . $Color . "'>" . $PalabraActual . "></span>"; $PalabraActual = ""; $Estado = ""; } else { if ($Texto[$i] == "<") { // Estabamos en una etiqueta falsa $TextoColoreado .= $PalabraActual; $PalabraActual = "<"; $InicioEtiqueta = $i + 1; } else { if ($Texto[$i] == "s") { // miramos si es el atributo style if (substr($Texto, $i, 5) == "style") { while ($Texto[$i] != "'" && $Texto[$i] != '"') { $PalabraActual .= $Texto[$i++]; } if ($Texto[$i] == "'") { $Estado = "Estilo_Str1"; } else { if ($Texto[$i] == '"') { $Estado = "Estilo_Str2"; } } $PalabraActual .= "<span class='Codigo_Azul'>" . $Texto[$i++]; $InicioEstilo = $i; } else { $PalabraActual .= $Texto[$i]; } } else { if ($Texto[$i] == "'") { // String con comillas simples dentro de la etiqueta $PalabraActual .= "<span class='Codigo_Azul'>'"; $Estado = "Etiqueta_Str1"; } else { if ($Texto[$i] == '"') { // String con comillas dobles dentro de la etiqueta $PalabraActual .= '<span class="Codigo_Azul">"'; $Estado = "Etiqueta_Str2"; } else { $PalabraActual .= $Texto[$i]; } } } } } break; // Estado : inicio del atributo style encapsulado por comillas simples // Estado : inicio del atributo style encapsulado por comillas simples case "Estilo_Str1": if (_FinString1($Texto, $i) == true) { $PalabraActual .= PintarEstiloCSS(substr($Texto, $InicioEstilo, $i - $InicioEstilo)) . "'</span>"; $Estado = "Etiqueta"; } break; // Estado : inicio del atributo style encapsulado por comillas dobles // Estado : inicio del atributo style encapsulado por comillas dobles case "Estilo_Str2": if (_FinString2($Texto, $i) == true) { $PalabraActual .= PintarEstiloCSS(substr($Texto, $InicioEstilo, $i - $InicioEstilo)) . '"</span>'; $Estado = "Etiqueta"; } break; // -[FIN devildrey33.PintarHTML2]- // -[INICIO devildrey33.PintarHTML3]- // Estado : inicio de un texto de un atributo dentro de una etiqueta script con comillas simples // -[FIN devildrey33.PintarHTML2]- // -[INICIO devildrey33.PintarHTML3]- // Estado : inicio de un texto de un atributo dentro de una etiqueta script con comillas simples case "JavaScript_Str1": if (_FinString1($Texto, $i) == true) { $PalabraActual .= "'</span>"; $Estado = "JavaScript_Inicio"; } else { $PalabraActual .= $Texto[$i]; } break; // Estado : inicio de un texto de un atributo dentro de una etiqueta script con comillas dobles // Estado : inicio de un texto de un atributo dentro de una etiqueta script con comillas dobles case "JavaScript_Str2": if (_FinString2($Texto, $i) == true) { $PalabraActual .= '"</span>'; $Estado = "JavaScript_Inicio"; } else { $PalabraActual .= $Texto[$i]; } break; // Estado : dentro de una etiqueta script // Estado : dentro de una etiqueta script case "JavaScript_Inicio": if ($Texto[$i] == ">") { // Final de una etiqueta script $TextoColoreado .= $PalabraActual . "></span>"; $PalabraActual = ""; $Estado = "JavaScript_Fin"; } else { if ($Texto[$i] == "'") { // String dentro de una etiqueta script con comillas simples $PalabraActual .= "<span class='Codigo_Azul'>'"; $Estado = "JavaScript_Str1"; } else { if ($Texto[$i] == '"') { // String dentro de una etiqueta script con comillas dobles $PalabraActual .= '<span class="Codigo_Azul">"'; $Estado = "JavaScript_Str2"; } else { $PalabraActual .= $Texto[$i]; } } } break; // Estado : se ha encontrado el final de una etiqueta script // Estado : se ha encontrado el final de una etiqueta script case "JavaScript_Fin": if (substr($Texto, $i, 9) == "</script>") { // Comprobamos que sea la etiqueta de cierre if (strlen($PalabraActual) > 1) { $TextoColoreado .= PintarJavaScript($PalabraActual); } else { $TextoColoreado .= $PalabraActual; } $TextoColoreado .= "<span class='Codigo_Marron'></script></span>"; $PalabraActual = ""; $Estado = ""; $i += 8; } else { $PalabraActual .= $Texto[$i]; } break; // -[FIN devildrey33.PintarHTML3]- // -[INICIO devildrey33.PintarHTML4]- // Estado : string dentro de una etiqueta style con comillas simples // -[FIN devildrey33.PintarHTML3]- // -[INICIO devildrey33.PintarHTML4]- // Estado : string dentro de una etiqueta style con comillas simples case "CSS_Str1": if (_FinString1($Texto, $i) == true) { $PalabraActual .= "'</span>"; $Estado = "CSS_Inicio"; } else { $PalabraActual .= $Texto[$i]; } break; // Estado : string dentro de una etiqueta style con comillas dobles // Estado : string dentro de una etiqueta style con comillas dobles case "CSS_Str2": if (_FinString2($Texto, $i) == true) { $PalabraActual .= '"</span>'; $Estado = "CSS_Inicio"; } else { $PalabraActual .= $Texto[$i]; } break; // Estado : etiqueta style inicial // Estado : etiqueta style inicial case "CSS_Inicio": if ($Texto[$i] == ">") { // Final de la etiqueta style $TextoColoreado .= $PalabraActual . "></span>"; $PalabraActual = ""; $Estado = "CSS_Fin"; } else { if ($Texto[$i] == "'") { // String con comillas simples dentro de la etiqueta style $PalabraActual .= "<span class='Codigo_Verde'>'"; $Estado = "CSS_Str1"; } else { if ($Texto[$i] == '"') { // String con comillas dobles dentro de la etiqueta style $PalabraActual .= '<span class="Codigo_Verde">"'; $Estado = "CSS_Str2"; } else { $PalabraActual .= $Texto[$i]; } } } break; // Estado : etiqueta style de cierre // Estado : etiqueta style de cierre case "CSS_Fin": if (substr($Texto, $i, 8) == "</style>") { $TextoColoreado .= PintarEstilosCSS($PalabraActual); $TextoColoreado .= "<span class='Codigo_Lila'></style></span>"; $PalabraActual = ""; $Estado = ""; $i += 8; } else { $PalabraActual .= $Texto[$i]; } break; // -[FIN devildrey33.PintarHTML4]- // -[INICIO devildrey33.PintarHTML5]- // Estado : Comentario HTML (puede ser multilinea) // -[FIN devildrey33.PintarHTML4]- // -[INICIO devildrey33.PintarHTML5]- // Estado : Comentario HTML (puede ser multilinea) case "Comentario": if ($Texto[$i] == ">" && $Texto[$i - 1] == "-" && $Texto[$i - 2] == "-") { $PalabraActual .= "></span>"; $Estado = ""; } else { if ($Texto[$i] == "<") { $PalabraActual .= "<"; } else { if ($Texto[$i] == ">") { $PalabraActual .= ">"; } else { $PalabraActual .= $Texto[$i]; } } } break; // Estado : dentro de un código php // Estado : dentro de un código php case "PHP": if ($Texto[$i] == ">" && $Texto[$i - 1] == "?") { $TextoColoreado .= PintarPHP($PalabraActual . ">"); $PalabraActual = ""; $Estado = ""; } else { $PalabraActual .= $Texto[$i]; } break; } } $TextoColoreado .= $PalabraActual; if ($_Debug == true) { echo "PintarHML<pre>"; print_r($Etiquetas); echo "</pre>"; } return $TextoColoreado; }
function PintarPHP($Texto) { // $_Debug = true; global $_DiccionarioPHP; $Texto = str_replace(' ', ' ', $Texto); // Cambio tabulaciones por 4 espacios $Texto = str_replace('<', '<', $Texto); // Cambio el caracter '<' por '<' $Texto = str_replace('>', '>', $Texto); // Cambio el caracter '>' por '>' $TotalCaracteres = strlen($Texto); $Palabras = array(); $TotalPalabras = 0; $Palabras[$TotalPalabras++] = "<span class='Codigo_Negro'>"; $PalabraActual = ""; $Estado = ""; // Puede ser : Comentario, ComentarioML, String1, String2, Variable, y Numero for ($i = 0; $i < $TotalCaracteres; $i++) { switch ($Estado) { case "": // Sin estado if ($Texto[$i] == "/" && $Texto[$i + 1] == "*") { // Principio ComentarioML $Estado = "ComentarioML"; $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = "<span class='Codigo_Amarillo'>/*"; $i++; } else { if ($Texto[$i] == "/" && $Texto[$i + 1] == "/") { // Principio Comentario $Estado = "Comentario"; $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = "<span class='Codigo_Amarillo'>//"; $i++; } else { if ($Texto[$i] == '"' && $Texto[$i - 1] != "\\") { // Principio String2 $Estado = "String2"; $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = '<span class="Codigo_Rojo">"'; } else { if ($Texto[$i] == "'" && $Texto[$i - 1] != "\\") { // Principio String1 $Estado = "String1"; $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = "<span class='Codigo_Rojo'>'"; } else { if ($Texto[$i] == "\$") { // Principio Variable $Estado = "Variable"; $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = "<span class='Codigo_AzulClaro'>\$"; } else { if (_EsNumero($Texto[$i]) == true && _BuscarDelimitadorPHP($Texto[$i - 1])) { $Estado = "Numero"; $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = "<span class='Codigo_Rojo'>" . $Texto[$i]; } else { // Cualquier letra $PalabraActual .= $Texto[$i]; if (_BuscarDelimitadorPHP($Texto[$i]) == true) { // Para no gripar el array de palabras miramos que el siguiente caracter no sea un delimitador // Si no lo hacemos, creara un espacio en el array para cada delimitador, incluidos los caracteres ' ' // De todas formas no estoy seguro si esto puede traer problemas if (_BuscarDelimitadorPHP($Texto[$i + 1]) != true) { $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = ""; } } } } } } } } break; // Estado : comentario multi linea // Estado : comentario multi linea case "ComentarioML": if ($Texto[$i] == "*" && $Texto[$i + 1] == "/") { $Palabras[$TotalPalabras++] = $PalabraActual . "*/</span>"; $PalabraActual = ""; $Estado = ""; $i++; } else { $PalabraActual .= $Texto[$i]; } break; // Estado : comentario hasta el final de la linea // Estado : comentario hasta el final de la linea case "Comentario": if ($Texto[$i] == chr(10) || $Texto[$i] == chr(13)) { $Palabras[$TotalPalabras++] = $PalabraActual . "</span>" . $Texto[$i]; $PalabraActual = ""; $Estado = ""; } else { $PalabraActual .= $Texto[$i]; } break; // Estado : string de comillas dobles // Estado : string de comillas dobles case "String2": if (_FinString2($Texto, $i) == true) { $Palabras[$TotalPalabras++] = $PalabraActual . '"</span>'; $PalabraActual = ""; $Estado = ""; } else { $PalabraActual .= $Texto[$i]; } break; // Estado : string de comillas simples // Estado : string de comillas simples case "String1": if (_FinString1($Texto, $i) == true) { $Palabras[$TotalPalabras++] = $PalabraActual . "'</span>"; $PalabraActual = ""; $Estado = ""; } else { $PalabraActual .= $Texto[$i]; } break; // Estado : en una variable // Estado : en una variable case "Variable": if (_BuscarDelimitadorPHP($Texto[$i]) == true) { $Palabras[$TotalPalabras++] = $PalabraActual . "</span>"; $PalabraActual = ""; $Estado = ""; } $PalabraActual .= $Texto[$i]; break; // Estado : en un valor numérico // Estado : en un valor numérico case "Numero": if (_BuscarDelimitadorPHP($Texto[$i]) == true) { $Palabras[$TotalPalabras++] = $PalabraActual . "</span>"; $PalabraActual = $Texto[$i]; $Estado = ""; } else { $PalabraActual .= $Texto[$i]; } break; } } // Si se ha quedado algun estado abierto, cerramos su span // (los comentarios pueden quedar abiertos si se encuentran en la ultima linea) if ($Estado != "") { $PalabraActual .= "</span>"; } // Pasamos la ultima palabra al array de palabras $Palabras[$TotalPalabras++] = $PalabraActual; // -[FIN devildrey33.PintarPHP1]- // -[INICIO devildrey33.PintarPHP2]- // Post-análisis del array de palabras for ($i = 0; $i < $TotalPalabras; $i++) { if ($Palabras[$i][0] != '<') { // Si tiene '<' es el principio de un span por lo que no se debe tocar foreach ($_DiccionarioPHP as $Palabra) { $PosPalabra = strpos($Palabras[$i], $Palabra['Palabra']); // El operador !== también puede ser usado. // Puesto que != no funcionará como se espera porque si la posición de la palabra es 0. // La declaración (0 != false) se evalúa a false. if ($PosPalabra !== false) { $DelimitadorInicio = false; $DelimitadorFin = false; $TamPalabra = strlen($Palabra['Palabra']); // Miramos si el caracter anterior es un delimitador if ($PosPalabra == 0) { $DelimitadorInicio = true; } else { $DelimitadorInicio = _BuscarDelimitadorPHP($Palabras[$i][$PosPalabra - 1]); } // Miramos si el caracter inmediatamente siguiente a la palabra es un delimitador if ($PosPalabra + $TamPalabra == strlen($Palabras[$i])) { $DelimitadorFin = true; } else { $DelimitadorFin = _BuscarDelimitadorPHP($Palabras[$i][$PosPalabra + $TamPalabra]); } // Si la palabra esta bien delimitada la coloreamos if ($DelimitadorInicio == true && $DelimitadorFin == true) { $Palabras[$i] = str_replace($Palabra['Palabra'], "<span class='" . $Palabra['Color'] . "'>" . $Palabra['Palabra'] . "</span>", $Palabras[$i]); break; // Salimos del foreach para no colorear 2 veces la misma palabra } } } } $TextoColoreado .= $Palabras[$i]; } // Imprime el array para depurar if ($_Debug == true) { echo "PintarPHP<pre>"; print_r($Palabras); echo "</pre>"; } // Buscamos el inicio del código PHP que al ser con <?php no es detectable por el algoritmo (<?php) $TextoColoreado = str_replace("<?php", "<span class='Codigo_Rojo'><?php</span>", $TextoColoreado); return $TextoColoreado . "</span>"; }
function PintarC($Texto) { global $_DiccionarioC; $Texto = str_replace(' ', ' ', $Texto); // Cambio tabulaciones por 4 espacios $Texto = str_replace('<', '<', $Texto); // Cambio el caracter '<' por '<' $Texto = str_replace('>', '>', $Texto); // Cambio el caracter '>' por '>' $TotalCaracteres = strlen($Texto); $Palabras = array(); $TotalPalabras = 0; $Palabras[$TotalPalabras++] = "<span class='Codigo_Negro'>"; $PalabraActual = ""; $Estado = ""; // Puede ser : Comentario, ComentarioML, String1, String2, Directiva, Directiva_Fin for ($i = 0; $i < $TotalCaracteres; $i++) { switch ($Estado) { case "": // Sin estado if ($Texto[$i] == "/" && $Texto[$i + 1] == "*") { // Principio ComentarioML $Estado = "ComentarioML"; $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = "<span class='Codigo_Verde'>/*"; $i++; } else { if ($Texto[$i] == "/" && $Texto[$i + 1] == "/") { // Principio Comentario $Estado = "Comentario"; $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = "<span class='Codigo_Verde'>//"; $i++; } else { if ($Texto[$i] == '"' && $Texto[$i - 1] != "\\") { // Principio String2 $Estado = "String2"; $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = '<span class="Codigo_Rojo">"'; } else { if ($Texto[$i] == "'" && $Texto[$i - 1] != "\\") { // Principio String1 $Estado = "String1"; $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = "<span class='Codigo_Rojo'>'"; } else { if ($Texto[$i] == "#" && $Texto[$i + 1] != "#" && $Texto[$i - 1] != "#") { $Estado = "Directiva"; $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = "<span class='Codigo_Azul'>#"; } else { // Cualquier letra $PalabraActual .= $Texto[$i]; if (_BuscarDelimitadorC($Texto[$i]) == true) { // Para no gripar el array de palabras miramos que el siguiente caracter no sea un delimitador // Si no lo hacemos, creara un espacio en el array para cada delimitador, incluidos los caracteres ' ' // De todas formas no estoy seguro si esto puede traer problemas if (_BuscarDelimitadorC($Texto[$i + 1]) != true) { $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = ""; } } } } } } } break; // -[FIN devildrey33.PintarC1]- // -[INICIO devildrey33.PintarC2]- // Estado : dentro de una directiva ej : #include // -[FIN devildrey33.PintarC1]- // -[INICIO devildrey33.PintarC2]- // Estado : dentro de una directiva ej : #include case "Directiva": if ($Texto[$i] == " ") { $Palabras[$TotalPalabras++] = $PalabraActual . " </span>"; $PalabraActual = ""; $Estado = "Directiva_Fin"; } else { $PalabraActual .= $Texto[$i]; } break; // Estado : justo despues de una directiva. // Hay que mirar por si empieza un simbolo < // Estado : justo despues de una directiva. // Hay que mirar por si empieza un simbolo < case "Directiva_Fin": switch ($Texto[$i]) { case "&": // posible < o > if (substr($Texto, $i, 4) == "<") { // < $PalabraActual .= "<span class='Codigo_Rojo'><"; $i += 3; } else { if (substr($Texto, $i, 4) == ">") { // > $PalabraActual .= "></span>"; $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = ""; $Estado = ""; $i += 3; } else { $PalabraActual .= "&"; } } break; case "/": // Pasamos el estado a String1 if ($Texto[$i + 1] == "/") { $Estado = "Comentario"; $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = "<span class='Codigo_Verde'>//"; $i++; } else { if ($Texto[$i + 1] == "*") { $Estado = "ComentarioML"; $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = "<span class='Codigo_Verde'>/*"; $i++; } else { $PalabraActual .= $Texto[$i]; } } break; case "'": // Pasamos el estado a String1 $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = "<span class='Codigo_Rojo'>'"; $Estado = "String1"; break; case '"': // Pasamos el estado a String2 $Palabras[$TotalPalabras++] = $PalabraActual; $PalabraActual = '<span class="Codigo_Rojo">"'; $Estado = "String2"; break; case chr(10): case chr(13): $PalabraActual .= $Texto[$i]; $Estado = ""; break; default: $PalabraActual .= $Texto[$i]; break; } break; // Estado : dentro de un comentario multilinea // Estado : dentro de un comentario multilinea case "ComentarioML": if ($Texto[$i] == "*" && $Texto[$i + 1] == "/") { $Palabras[$TotalPalabras++] = $PalabraActual . "*/</span>"; $PalabraActual = ""; $Estado = ""; $i++; } else { $PalabraActual .= $Texto[$i]; } break; // Estado : dentro de un comentario hasta el final de la linea // Estado : dentro de un comentario hasta el final de la linea case "Comentario": if ($Texto[$i] == chr(10) || $Texto[$i] == chr(13)) { $Palabras[$TotalPalabras++] = $PalabraActual . "</span>" . $Texto[$i]; $PalabraActual = ""; $Estado = ""; } else { $PalabraActual .= $Texto[$i]; } break; // Estado : dentro de un string con comillas dobles // Estado : dentro de un string con comillas dobles case "String2": if (_FinString2($Texto, $i) == true) { $Palabras[$TotalPalabras++] = $PalabraActual . '"</span>'; $PalabraActual = ""; $Estado = ""; } else { $PalabraActual .= $Texto[$i]; } break; // Estado : dentro de un string con comillas simples // Estado : dentro de un string con comillas simples case "String1": if (_FinString1($Texto, $i) == true) { $Palabras[$TotalPalabras++] = $PalabraActual . '"</span>'; $PalabraActual = ""; $Estado = ""; } else { $PalabraActual .= $Texto[$i]; } break; } } // Si se ha quedado algun estado abierto, cerramos su span // (los comentarios pueden quedar abiertos si se encuentran en la ultima linea) if ($Estado != "") { $PalabraActual .= "</span>"; } // Pasamos la ultima palabra al array de palabras $Palabras[$TotalPalabras++] = $PalabraActual; // -[FIN devildrey33.PintarC2]- // -[INICIO devildrey33.PintarC3]- for ($i = 0; $i < $TotalPalabras; $i++) { if ($Palabras[$i][0] != '<') { // Si tiene '<' es el principio de un span por lo que no se debe tocar foreach ($_DiccionarioC as $Palabra) { $PosPalabra = strpos($Palabras[$i], $Palabra['Palabra']); // El operador !== también puede ser usado. // Puesto que != no funcionará como se espera porque si la posición de la palabra es 0. // La declaración (0 != false) se evalúa a false. if ($PosPalabra !== false) { $DelimitadorInicio = false; $DelimitadorFin = false; $TamPalabra = strlen($Palabra['Palabra']); // Miramos si el caracter anterior es un delimitador if ($PosPalabra == 0) { $DelimitadorInicio = true; } else { $DelimitadorInicio = _BuscarDelimitadorC($Palabras[$i][$PosPalabra - 1]); } // Miramos si el caracter inmediatamente siguiente a la palabra es un delimitador if ($PosPalabra + $TamPalabra == strlen($Palabras[$i])) { $DelimitadorFin = true; } else { $DelimitadorFin = _BuscarDelimitadorC($Palabras[$i][$PosPalabra + $TamPalabra]); } // Si la palabra esta bien delimitada la coloreamos if ($DelimitadorInicio == true && $DelimitadorFin == true) { $Palabras[$i] = str_replace($Palabra['Palabra'], "<span class='" . $Palabra['Color'] . "'>" . $Palabra['Palabra'] . "</span>", $Palabras[$i]); break; // Salimos del foreach para no colorear 2 veces la misma palabra } } } } $TextoColoreado .= $Palabras[$i]; } // Imprime el array para depurar if ($_Debug == true) { echo "PintarC<pre>"; print_r($Palabras); echo "</pre>"; } return $TextoColoreado . "</span>"; }