Buscar enlaces en una cadena y convertirlos en enlaces HTML con php (preg_replace_callback).
Actualmente casi todos los sitios webs tiene algún método para reconocer enlaces. Da igual donde dejemos un comentario. Puede ser un foro, un chat, un blog, etc. Seguro que cuando enviemos un mensaje, si este contiene algún enlace, una vez publicado podremos pinchar sobre él.
Yo como usuario, lo encuentro bastante útil y cómodo. Por un lado, si soy un visitante, es algo incomodo copiar y pegar el enlace en la barra de direcciones. Es mucho mas fácil hacer “click” sobre el enlace.
Por otro lado, si soy el autor de un comentario y quiero dejar un enlace, solo tengo que escribirlo, no tengo que preocuparme de hacer que sea pinchable.
Por ese motivo, dejo a vuestra disposición una clase en php para leer un texto y convertir en etiquetas HTML todos los enlaces que contenga el texto.
Actualmente solo reconoce los enlaces que comienzan por “http://” pero puede mejorarse para que detecte mas enlaces o realice mas operaciones, esto ya depende de las necesidades de cada uno.
A continuación el código y un ejemplo de uso.
<?php /** * Con esta clase podemos convertir los enlaces de un texto. * Por ejemplo si escribirmos: * http://www.ejemplo.com * se convertirá automáticamente en: * <a href="http://www.ejemplo.com">http://www.ejemplo.com</a> */ class Enlaces { private $_texto; private $_logs; private $_debug = false; private $_existen = false; public function __construct($texto = false, $debug = false) { //Saber si hay que mostar los mensajes de debug por pantalla o no. if($debug) { $this->_debug = true; } //Verificar que se indicó un texto a parsear if(!$texto || empty($texto)) { $this->_logs = "Error! Usted no indico la cadena a parsear. \r\n"; } else { $this->_texto = $texto; } //Parsear texto if(!$this->parsear()) { $this->_logs .= "Error! El texto indicado no se puede parsear o no tiene enlaces. \r\n"; } else { $this->_logs .= "Texto parseado correctamente"; } } /* * Parsear el texto buscando enlaces. Se buscan las cadenas que comienzan por: * "http://" sin comillas. * * Retorna: true si se parsea correctamente, false si no se parsea o * si no existen enlaces en el texto. */ private function parsear() { $this->_texto = preg_replace_callback("/(http:\/\/[\w\/*\?*\&*\=*\.*]+)/", "Enlaces::enlacesDetectados", $this->_texto); if($this->_texto == "NULL" || $this->_existen == false) { return false; } else { return true; } } /** * Convierte los enlaces en enlaces HTML. Si queremos añadir atributos a los enlaces generados, debemos * hacerlo aquí. */ private function enlacesDetectados($coincidencias) { foreach($coincidencias as $enlace) { $this->_existen = true; $enlace = "<a href='" . $enlace . "'>" . $enlace . "</a>"; return $enlace; } } /** * Devuelve el texto con los enlaces convertidos. */ public function getTexto() { return $this->_texto; } /** * Devuelve el logs generado durante la ejecución. Solo devuelve el logs si se indico previamente. */ public function getLogs() { if($this->_debug) { return $this->_logs; } } } /** * EJEMPLO DE USO */ $texto = " Este es un texto de prueba. Con un enlace a http://www.google.es y otro enlace a http://google.com, ¿ Que te parece ?"; $enlaces = new Enlaces($texto); echo $enlaces->getTexto(); /** * Se imprime: * Este es un texto de prueba. Con un enlace a <a href='http://www.google.es'>http://www.google.es</a> y otro enlace a <a href='http://google.com'>http://google.com</a>, ¿ Que te parece ? */ ?>
No hay artículos relacionados




















No anda
Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2,
ERROR:
Warning: preg_replace_callback() [function.preg-replace-callback]: Requires argument 2, ‘Enlaces::enlacesDetectados’, to be a valid callback in C:\programas_usuario\xampp\htdocs\tmp\elink.php on line 49
Solución
Cambiar la línea:
$this->_texto = preg_replace_callback(”/(http:\/\/[\w\/*\?*\&*\=*\.*]+)/”,
“Enlaces::enlacesDetectados”, $this->_texto);
Por:
$this->_texto = preg_replace_callback(”/(http:\/\/[\w\/*\?*\&*\=*\.*]+)/”,
array(”Enlaces”, “enlacesDetectados”), $this->_texto);