FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
#2
|
|||
|
|||
Lo siento Román, sé que no has contestado porqué no has visto el post, de haberlo visto estoy seguro de que hubieses contestado. Sólo pretendia que mi post subiera otra vez a la cabeza del subforo para que lo vieras, era una forma de llamar la atención. Quizá, mi comentario no ha estado del todo oportuno, en ningún momento he pensado/queria decir que me ignoras. Tú también tienes derecho a una vida privada en plenas condiciones, y desde ningún punto de vista, estos foros han de superar, en cuanto a primordialidad, a tu vida.
Una vez más, te pido disculpas por el comentario. No pretendia tacharte de pasota, ni de desinteresado. Mil perdones, que este pequeño incidente no obstaculize nuestra relación de colaboradores (yo siempre que pueda, se que tú tambén, intentaré ayudar a todos los usuarios). No pretendo ser repetitivo, pero por si no han quedado claras mis disculpas: Mil perdones, compañero Román. |
#3
|
|||
|
|||
Por favor, Román, no estés molesto. Te pido mil disculpas.
|
#4
|
||||
|
||||
Como ya te comentó David, la implementación específica dependerá del sistema de foros que uses y yo desconozco por completo el que mencionas.
El resaltado en sí se hace mediante un script PHP. Por el momento no tengo pensado publicarlo pero puedo darte la idea general, que, en mi opinión, es mucho mejor que poner el código final. Dado que estamos hablando de PHP, muevo además este hilo al foro correspondiente. La base del resaltado es la identificación de los distintos tokens a resaltar mediante el uso de expresiones regulares. A grandes rasgos, una expresión regular es un patrón que permite identificar porciones de texto. Sin duda todos hemos escrito alguna vez algo como: Código:
msdos>dir arch.*bk Sin embargo, el uso de comodines es una aproximación muy limitada a las expresiones regulares. PHP utiliza las expresiones PCRE (Perl Compatible Regular Expressions) que permiten detectar una amplia gama de patrones. Por ejemplo, la expresión Código:
[a-z_][a-z0-9_]*
Esto es, el patrón identificará, por ejemplo: Código:
_hola h hola hola2 Código:
2hola Otro ejemplo de expresión regular: Código:
'.*' Código:
Cadena := 'esta es ' + 'una cadena'; Para evitar esto hay que utilizar la directiva ? para indicar que se detecte "lo mínimo posible": Código:
'.*?' Con esto, el compilador de expresiones regulares parará en el segundo apóstrofe indicando que la cadena 'esta es ' coincide con el patrón y volverá a comenzar en el tercer apóstrofe deteniéndose nuevamente en el cuarto indicando que 'una cadena' también satisface el patrón. Una situación similar se presenta con los bloques de comentarios. La expresión regular sería: Código:
{.*?} Código:
[a-z]{3,4} Para poder incluir las llaves (y otros caracteres especiales) como parte de la expresión regular, deben "escaparse" con el símbolo de escape \. Así, la expresión para bloques de comentarios quedaría: Código:
\{.*?\} Código:
\(\*.*?\*\) //.*?\n \n, en los comentarios de línea significa "final de línea", de manera que el patrón detectará todo lo que comience con // y termine cuando termine la línea. Dos expresiones regulares, X y Z, pueden unirse con el operador | de disyunción: Código:
X|Z Código:
\{.*?\}|\(\*.*?\*\)|//.*?\n|//.*$ Aquí agregué Código:
//.*$ Código:
unit Hola; interface implementation end. // esto es todo amigos Con esto detectamos las partes más importantes para el resaltado de código pascal:
PHP incluye varias funciones para el manejo de expresiones regulares tipo Perl. La que usé en el resaltador es preg_replace_callback: Código PHP:
Ahora bien, lo que yo paso en $reg_exp, es la concatenación de todas las expresiones regulares descritas: Código PHP:
Básicamente, cada coincidencia se reemplazará con el mismo texto encontrado pero rodeado de etiquetas <span>, por ejemplo, en Código:
cadena := 'esta es una cadena'; Código:
<span class="quote">'esta es una cadena'</span> El tercer parámetro de preg_replace_callback es el texto que deseamos resaltar y el segundo parámetro es el nombre de una función que es la que efectuará los reemplazos: Código PHP:
En este arreglo, el primer elemento, $matches[0] contiene la porción de texto que haya coincidido, $matches[1] la parte que haya concidido con el primer grupo, $matches[2] la parte que haya coincidido con el segundo grupo, etc. En nuestra función de reemplazo tenemos entonces que comparar $matches[0] con cada grupo para saber qué reemplazar: Código PHP:
Como se ve, la función debe regresar el texto reemplazado. En el caso de identificadores, no todo identificador es una palabara reservada, así que debemos cotejar el identificador contra una lista de palabras reservadas: Código PHP:
Código PHP:
Esto más o menos cubre todo lo necesario para el resaltado. Cabe notar que podríamos simplificarlo usando preg_replace en lugar de preg_replace_callback. Una vez para los comentarios, otra vez para las cadenas y una tercera vez para las palabras reservadas (preg_replace acepta un areglo como parámetro indicando que han de reemplazarse todos los elementos que encuentre en el arreglo), pero me pareció más flexible así ya que además podemos ampliar la expresión regular para abarcar, por ejemplo:
Obviamente, conviene un mediano entendimiento del uso de expresiones regulares para lo cual, además del mismo manual de PHP, podrás encontrar infinidad de tutoriales en la red. Yo, de hecho aprendí con éste. // Saludos |
#5
|
||||
|
||||
Hola,
Enhorabuena Román, explicación y ayuda excelentes. |
#6
|
||||
|
||||
Maese Roman, que bárbaro
__________________
|
#7
|
||||
|
||||
Interesante la información Roman, la verdad es que estoy interesado en tratar de hacer algo asi para una web.
Código PHP:
|
#8
|
||||
|
||||
Este mensaje de roman me parece un excelente tutorial de expresiones regulares en español. De hecho, será mi punto de referencia dentro y fuera del club para los neófitos en este tema.
Gracias por tan excelente contenido, amigo roman. Saludos.
__________________
Juan Antonio Castillo Hernández (jachguate) Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate |
#9
|
|||
|
|||
Si Gunman sabía quien le responderia la duda, porque no le manda un Mail en lugar de tener que rogar publicamente que le contesten.
Es una sugerencia...... |
#10
|
||||
|
||||
// Saludos |
#11
|
||||
|
||||
Cita:
¿Hubieses preferido prescindir de este hilo completo? saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente, se lo volveré a explicar hasta que no lo entienda, Gracias. |
|
|
|