"Hay hombres que luchan un día y son buenos. Hay otros que luchan un año y son mejores. Hay quienes luchan muchos años y son muy buenos. Pero hay los que luchan toda la vida: esos son los imprescindibles. "

Soy una persona apasionada por todo lo que tiene que ver con Internet y las nuevas tecnologías. Soy autodidacta, y me encanta impartir clases...


Valida y detecta urls con PHP

Viernes 31 de Diciembre de 2010

Varios sobre PHP y MySQL
Autor: César Cancino
Categoría: Varios sobre PHP y MySQL
Etiquetas Programación, php, mysl
Comentarios 2

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.

¿Qué te gustaría compartir con nosotros?

Compartir

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));

?>



2 Comentarios

  1. Alex
    Jueves 04 de Julio de 2013

    Deberían utilizar un mejor visor de código. Para darle mas interés a su contenido.

  2. Kapry
    Lunes 16 de Enero de 2012

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