Nuestro amigo zherhatul ha compartido un excelente script hecho en php, que nos permite recorrer una cadena, buscar determinadas palabras y convertirnas en links. En mi humilde opinión puede ser muy útil para hacer sistemas de trackeo, como por ejemplo lo que realiza infolink.com.
A continuación les muestro el código básico con el que trabajaremos:
<?php
/*************************************funcion cambia a link**********************************************************************/
function validar_url($url){//valida la url con protocolo o sin
if(substr($url,strlen($url)-1,strlen($url)-1)=='.'){//comprueba si la palabra termina con punto o en una coma si un link termina en punto o coma no sera valido
$agregado='.';
$url=substr($url,0,strlen($url)-1); //aqui son quitados los puntos y comas finales para verificar si la palabra es una direcion web
}elseif(substr($url,strlen($url)-1,strlen($url)-1)==','){
$agregado=','; //son guardos (la coma o el punto) para luego ser agregados al string
$url=substr($url,0,strlen($url)-1);
}else{
$agregado='$'; //indica que no se encontraron puntos y comas al final de la palabra
}
//TIPO DE CONEXIÓN
$urlregex = "^(https?|ftp)\:\/\/";// valida los protocolos http | https | ftp
//USUARIO Y CONTRASEÑA (opcional)
$urlregex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?";
//EL NOMBRE DE LA WEB O LA IP
//$urlregex .= "[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)*"; // http://x = allowed (ejemplo. http://localhost, http://routerlogin)
$urlregex .= "[a-z0-9+\$_-]+(\.[a-z0-9+\$_-]+)+"; // http://x.x = minimum //acepta como minimo un dominio
//$urlregex .= "([a-z0-9+\$_-]+\.)*[a-z0-9+\$_-]{2,3}"; // http://x.xx(x) = minimum
//PUERTO (opcional)
$urlregex .= "(\:[0-9]{2,5})?";
//RUTA (opcional)
$urlregex .= "(\/([a-z0-9+\$_-~]\.?)+)*\/?";// la ruta de acceso al recurso tambien se puede modificar para que acepte mas caracteres especiales como cualquier directorio
//GET de la ruta (opcional)
$urlregex .= "(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?";// paso de variables por metodo get
//ANCLA de la ruta (opcional)
$urlregex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?\$";// ancla <a href
//COMPROBAMOS
if(eregi($urlregex, $url)){ //aqui se comprueba si la exprecion anterior se cumple - valida la url con protocolo
return 'conprotocolo'.$agregado; // se retorna si es validala url mas el agregado si tiene (punto y coma)al final
}else{ //sino validamos que sea sin protocolo
$urlregex2 .= "^w{3}"; // valida las www al comienzo de la url
$urlregex2 .= "(\.[a-z0-9+\$_-]+)+"; //------------------------------
$urlregex2 .= "(\:[0-9]{2,5})?";
$urlregex2 .= "(\/([a-z0-9+\$_-~]\.?)+)*\/?"; //esto ya esta explicado
$urlregex2 .= "(\?[a-z+&\$_.-][a-z0-9;:@/&%=+\$_.-]*)?";
$urlregex2 .= "(#[a-z_.-][a-z0-9+\$_.-]*)?\$";//-----------------------
if(eregi($urlregex2, $url)){//aqui se comprueba si la exprecion anterior se cumple - valida la url con sin protocolo
return 'sinprotocolo'.$agregado; // se retorna si es validala url mas el agregado si tiene (punto y coma)al final
}else{
return 'false'; // si no es una url devuelve falso
}
}
}
/*************************************Cierra funcion cambia a link**********************************************************************/
/************************************************Funcion cambiar palabra a Link*******************************************************************************************/
function cambiaALink($text){ //Esta funcion separa y evalua cada palabra en el texto para identificar la url son separadas por espacios y saltos de linea
$text=ereg_replace("\n",chr(13).chr(10),$text); //no podia dividir el texto por saltos de linea con '\n' asi que los converti a 'chr(13).chr(10)' que es lo mismo
$arrayBuscaLink = explode(' ',$text);// separa las palabras por espacios en un array
//echo count($arrayBuscaLink);
for ($i=0; $i<count($arrayBuscaLink); $i++) {//bucle principal que recorre el texto buscando urls
$arrayBuscaLink2 = $arrayBuscaLink[$i]; // se asigna el valor del registro actual a una variable
$cantidadCaracteresArrayBuscaLink2=strlen($arrayBuscaLink2);// contiene la cantidad de palabras resultantes en el texto
$textAEval= validar_url($arrayBuscaLink2); // se asigna el valor resultante de la funcion validaurl a una variable
if(substr($textAEval,0,12)=='conprotocolo'){// se compara si el resultado es una url con protocolo incluido
if(substr($textAEval,12,12)== '$'){ //el signo '$' indica nadamas que la url no termina en un punto o coma
$arrayBuscaLink[$i]= '[a] href="'.$arrayBuscaLink2.'"[]]'.$arrayBuscaLink2.'[/a]'; //si es una url con protocolo y sin punto o coma se asigna a la palabra actual este valor
}else{ //si posee una coma o un punto se crea el link y luego se agrega la coma o punto
$arrayBuscaLink[$i]= '[a] href="'.substr($arrayBuscaLink2,0,$cantidadCaracteresArrayBuscaLink2-1).'"[]]'.substr($arrayBuscaLink2,0,$cantidadCaracteresArrayBuscaLink2-1).'[/a]'.substr($textAEval,12,12);
}
}elseif(substr($textAEval,0,12)=='sinprotocolo'){// se compara si el resultado es una url sin protocolo incluido
if(substr($textAEval,12,12)== '$'){//el signo '$' indica nadamas que la url no termina en un punto o coma
$arrayBuscaLink[$i]= '[a] href="http://'.$arrayBuscaLink2.'"[]]'.$arrayBuscaLink2.'[/a]'; //si es una url con protocolo y sin punto o coma se asigna a la palabra actual este valor
}else{ //si posee una coma o un punto se crea el link y luego se agrega la coma o punto
$arrayBuscaLink[$i]= '[a] href="http://'.substr($arrayBuscaLink2,0,$cantidadCaracteresArrayBuscaLink2-1).'"[]]'.substr($arrayBuscaLink2,0,$cantidadCaracteresArrayBuscaLink2-1).'[/a]'.substr($textAEval,12,12);
}
}else{//sino se cumple lo anterior se deja la palabra tal cual
$arrayBuscaLink[$i]=$arrayBuscaLink2; //esto se puede omitir ya que '$arrayBuscaLink[$i]' conserva su valor pero se ve bonito
}
$arrayBuscaLink3 = explode(chr(13).chr(10),$arrayBuscaLink[$i]);// crea un array con las palabras que no fueron cortadas por los espacios
//Ej: zherhatul.net23.netchr(13).chr(10)xxxxxxxxxxx
// chr(13).chr(10) es igual a un salto de linea.
$arrayBuscaLink[$i]=''; //inicializa el valor de la palabra actual
for ($f=0; $f<count($arrayBuscaLink3); $f++) { //bucle que permite recorrer el nuevo array con las palabras separadas por saltos de linea
$arrayBuscaLink4 = $arrayBuscaLink3[$f]; //se asigna el registro actual a una variable para poder trabajar con el valor
$cantidadCaracteresArrayBuscaLink3=strlen($arrayBuscaLink4);// contiene la cantidad de palabras resultantes en el texto
$textAEval2= validar_url($arrayBuscaLink4); // se asigna el valor resultante de la funcion validaurl a una variable
if(substr($textAEval2,0,12)=='conprotocolo'){//-----------------------------------------------------------------------------------------------------------------
if(substr($textAEval2,12,12)== '$'){
$arrayBuscaLink3[$f]= '[a] href="'.$arrayBuscaLink4.'"[]]'.$arrayBuscaLink4.'[/a]';
}else{
$arrayBuscaLink3[$f]= '[a] href="'.substr($arrayBuscaLink4,0,$cantidadCaracteresArrayBuscaLink3-1).'"[]]'.substr($arrayBuscaLink4,0,$cantidadCaracteresArrayBuscaLink3-1).'[/a]'.substr($textAEval2,12,12);
}
}elseif(substr($textAEval2,0,12)=='sinprotocolo'){ //ESTO YA ESTA EXPLICADO
if(substr($textAEval2,12,12)== '$'){
$arrayBuscaLink3[$f]= '[a] href="http://'.$arrayBuscaLink4.'"[]]'.$arrayBuscaLink4.'[/a]';
}else{
$arrayBuscaLink3[$f]= '[a] href="http://'.substr($arrayBuscaLink4,0,$cantidadCaracteresArrayBuscaLink3-1).'"[]]'.substr($arrayBuscaLink4,0,$cantidadCaracteresArrayBuscaLink3-1).'[/a]'.substr($textAEval2,12,12);
}
}else{
$arrayBuscaLink3[$f]=$arrayBuscaLink4;
}//-----------------------------------------------------------------------------------------------------------------------------------------------------------------
if(($f+1)<count($arrayBuscaLink3)){
$arrayBuscaLink[$i].=$arrayBuscaLink3[$f].chr(13).chr(10); //Son agregados los saltos de linea
}else{
$arrayBuscaLink[$i].=$arrayBuscaLink3[$f]; //sino se deja la palabra tal cual
}
}
$text2.=$arrayBuscaLink[$i]." ";// se agrega la palabra o link y los espacios
}
return $text2; // se retorna el resultado
}
/************************************************Cierre Funcion cambiar palabra a Link*******************************************************************************************/
/****************************Funcion para cambiar caracteres**************************************************/
function devuelveAHref($texto){ //Esta funcion cambia los caracteres modificados para evitar injeccion de codigo
$cambia=array('[a]'=> '<a','[]]'=> '>','[/a]'=> '</a>',);
$resultado=strtr( $texto , $cambia);
return $resultado;
}
/****************************Cierre Funcion para cambiar caracteres**************************************************/
//Ejemplo de uso
$texto="xxxx xxxxx www.zherhatul.net23.net/usuarios/zherhatul/zherhatul.php, ssss sssss ssss http://zherhatul.net23.net/usuarios/zherhatul/zherhatul.php.";
echo devuelveAHref(cambiaALink($texto));
?>
DEMO
























































Muy interesante este código Muchas gracias por compartirlo :) saludos