Ver Mensaje Individual
  #10  
Antiguo 30-01-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Nunca subestimen el poder de las expresiones regulares

El manual que les referí originalmente comienza con las siguientes palabras:

Cita:
[...] A lot of people seem to prefer writing lines and lines of code to solve a problem with simple string functions rather than getting into regular expressions to do it with just one statement.
Cita:
Mucha gente parece preferir escribir líneas y líneas de código para resolver un problema usando las funciones estándar de cadenas, en lugar de usar expresiones regulares y hacerlo con una sóla instrucción.
Aunque ya tenía yo algún convencimiento de ello, este fin de semana me he quedado impactado.

Quería hacer un resaltador de sintaxis similar al de las etiquetas [delphi] pero para código PHP, como alternativa al que trae integrado el mismo PHP. Me puse a revisar un paquete del que me comentó David y que al parecer tiene cierto reconocimiento y es usado en varios lados. Me refiero a GeSHi, que además del resaltado propiamente dicho, añade un sin fin de monerías como el numerado de líneas y enlaces al manual de php en cada término. Al margen de la conveniencia o no de tales agregados, y debido a lo que ellos mismos mencionan acerca de la lentitud del resaltado, me dio la curiosidad de resaltar al mismo GeSHi, esto es, al módulo principal geshi.php que abarca más de 2600 líneas. El resultado, un resaltado perfecto...

...hecho en ¡10.15 segundos!

Así que me puse a adaptar el resaltador [delphi] a un resaltador PHP, que dista todavía de ser perfecto, pero llevo unas 120 líneas y he logrado resaltar GeSHi en 0.10 segundos (cero punto diez segundos).

¿Dónde está el problema?

A mi modo de ver, está justo en la frase mencionada al principio. No es que no usen expresiones regulares; de hecho usan bastantes. El problema es que han implementado todo un parser para hacer el resaltado. Es decir, recorren toda la cadena de entrada, caracter por caracter, examinando qué hay en cada uno y actuando en consecuencia. El parser de PHP en sí- el que lee el código fuente -es magnífico, no cabe duda, pero hacer un parser con PHP es, por lo visto, algo poco recomendable.

Así pues, reafirmo mi recomendación para estudiar expresiones regulares. Ciertamente son difíciles pero valen la pena. Incluso estaba a punto de tirar la toalla ante un problema al momento de resaltar strings, pensando que tendría que darle la vuelta a las expresiones regulares, cuando en el mismo manual que menciono viene el ejemplo de cómo resolverlo.

// Saludos
Responder Con Cita