Utilizando substr
Publicado en php el 18/06/07 a las 05:11 pm
Este fin de semana me di a la tarea de arreglar el problema que venia arrastrando el blog desde su nacimiento con el problema del URL de los usuarios al momento de comentar.
Era molesto para varios y para mi incomodo, el tener siempre que estar pidiendo que no escribieran http:// dentro de la casilla de URL en los comentarios.
Esto debido a que al momento de imprimir la variable $www en mí código PHP, anteponía la cadena de texto: http://
Y bueno, ocurre que muchos escriben la dirección de su blog desde el http:// y otros desde www. Así que era difícil controlar eso a la hora de publicar el enlace.
Por lo que me vi a la tarea de investigar que instrucción podría usar para solucionar este problema y es ahi donde entra: substr.
substr
substr es una instrucción de PHP que permite devolver parte de una cadena de caracteres, por ejemplo:
Si yo tengo la siguiente cadena de caracteres almacenada en una variable llamada $www.
$www = "http://www.stanmx.com/";
Y quiero sacar de ella los primeros 7 caracteres, escribiría la siguiente instrucción:
$http = substr($www, 0, 7);
Aquí lo que le estoy diciendo es que de la variable $www, en la posición "0", substraiga los primeros 7 caracteres. Y los guarde en la nueva variable llamada $http.
Hasta aquí, podríamos mandar imprimir la variable $http y nos arrojaría como resultado: http://
Esto es en resumen lo que hace la instrucción substr, sin embargo tiene otras características que les recomiendo revisar en el sitio: http://www.php-es.com/function.substr.html
Volviendo a mí caso. Una vez que pude extraer los primeros 7 caracteres de la variable $www me di a la tarea de hacer una nueva extracción, ahora del resto de los caracteres de la cadena:
$direccion = substr($www, 7);
Con esta línea estoy diciendo que de la variable $www substraiga del carácter en la posición "7" (recuerden que en PHP los caracteres comienzan a contarse desde cero) en adelante y me los almacene en la variable $direccion.
La variable direccion entonces almacenaría la siguiente cadena de caracteres:
www.stanmx.com
Ahora bien, ya tengo los primeros 7 caracteres de la variable $www almacenados en la variable $http, y el resto en la variable $direccion.
A continuación lo que hice fue realizar una sentencia if, para averiguar si dentro de los caracteres de $www se encuentra al inicio si o no la cadena de caracteres http://.
if ("http://" == $http){
$www = $direccion;
}
else {
$www = $www;
}
La primera línea pregunta si la línea de caracteres "http://" es igual a los 7 caracteres guardados en la variable $http
De ser verdadero, la segunda línea almacena los caracteres de la variable $direccion en la variable $www. Lo cual hace que el anterior valor de $www sea remplazado por el nuevo valor el cual mando imprimir a la base de datos.
De ser falso, los caracteres de la variable $www continua igual y la mando imprimir a la base de datos.
El código final queda de la siguiente manera (donde la variable $www puede ser cualquier direccion de Internet con o sin http://):
$http = substr($www, 0, 7);
$direccion = substr($www, 0, 7);
if ("http://" == $http){
$www = $direccion;
}
else {
$www = $www;
}
Este es el código que utilice para solucionar el problema de las direcciones con o sin http://
Ahora lo que me queda investigar es si puedo meterlo dentro de alguna función y aplicarla directamente al $www sin tener que escribir todo el código dentro del mismo documento PHP.
Comentarios y sugerencias son bienvenidas.
Jonathan, bienvenidos de regreso a los comentarios.
34 } Comentarios
Victor De la Rocha
Comento el 18/06/07 a las 05:52 pm
A mi se me ocurrió algo así, y de una vez lo pongo en una función por si te sirve :)
Ahí está ya en una función como querías. Le pasas como parámetro el url que hay que filtrar, y analiza si existe '://'. Si existe te devuelve todo lo que hay después de ahí o si no te devuelve la url tal cual.
Stan
Comento el 18/06/07 a las 05:58 pm
Interesante, me llama la atencion esa instruccion que usas "strpos" voy a investigarla. Ya que aun necesito hacer unas cosas extra por aqui.
RoQ
Comento el 18/06/07 a las 06:07 pm
Supongo que poniendo https:// te jode todo
Stan
Comento el 18/06/07 a las 06:46 pm
&RoQ: Definitivamente se jode todo, jejeje!
Diego
Comento el 18/06/07 a las 07:01 pm
Yo lo haría de una usando esta línea de código:
echo str_replace('http://', '', $www);Y ya, si esta la cadena del primer parámetro, la reemplaza por la segunda en la cadena del tercer parámetro.
Si no está, no hace nada.
Octavio Alvarez
Comento el 18/06/07 a las 07:54 pm
if (strtolower(substr($www, 0, 7)) != "http://") $www = "http://" . $www;
No sé cómo lo conviertes a función, pero sí se puede. Igual y con el código en una sola línea ya no te conviene hacerlo función.
Octavio Alvarez
Comento el 18/06/07 a las 07:58 pm
Ooops, acabo de leer lo de https:// y creo que podrías usar mejor "strstr" para buscar "://". Igual y es ftp, tftp, o lo que sea.
if (!strstr($www, "://")) $www = "http://" . $www;
Victor De la Rocha
Comento el 18/06/07 a las 08:17 pm
De hecho en el código que te pasé al principio, aunque pongas https://, ftp://, la función te toma lo que haya después de '://'.
isha.net
Comento el 18/06/07 a las 10:14 pm
creo que no entendi tu post jiji
asi que no puedo darte alguna sugerencia
saluditos
adrmx
Comento el 19/06/07 a las 01:14 am
Chido por las clases de php lo digo por ti stan y por todos los que comentan :D
Ya se donde voy a exponer mis dudas cuando las tenga :D
Stan
Comento el 19/06/07 a las 11:06 am
@Diego: Gracias por la sugerencia, voy a probar el codigo que me mencionas, ya que veo que podria ayudarme en otra cosa que estoy haciendo.
@Octavio: Esa no me la sabia, hay muchas cosas aun desconozco de PHP, pero esas sugerencias que me hacen, las estoy investigando para ver como funcionan esas instrucciones. Gracias por el aporte.
@Victor: Gracias, no dudes que la probare al igual que las demas, Gracias.
@Isha.net: jejeje... ok, creo que en el proximo post, hablare de compañeros incomodos a lo largo de mi vida laboral, para ver si me das una ayudadita hahaha...
@adrmx: Saludos man, pues creeme que estos comentarios son una retroalimentacion para mi, para darme cuenta que hay otras formas de hacer las cosas, unas mas simples, otras mas tardadas, pero que todos los caminos llevan a lo mismo.
Agradezco a todos por sus comentarios y si hay mas sugerencias o recomendaciones son bienvenidas.
JEL
Comento el 19/06/07 a las 02:56 pm
A ver, a ver, a ver... =P
Una cosa, nomás... ¿"Walter"? ö_Ö
Stan
Comento el 19/06/07 a las 04:04 pm
@JEL: jajaja... quise decir Jonathan jajaja!!!
Esparta Palma
Comento el 19/06/07 a las 05:03 pm
if ("http://" == $http){$www = $direccion;
}
else {
$www = $www;
}
En tu codigo, si vas a usar la variable $www, entonces no necesitas el "else", por otro lado, no has considerado mejor hacerlo con expresiones regulares?
Hermann
Comento el 19/06/07 a las 05:14 pm
Creo que la mejor solución serían expresiones regulares
preg_match('/https?:\/\/([a-z0-9\-\.\_]+)/i',$http,$m)
Y $m[1] contendría la dirección. No lo he probado y seguramente esa expresión regular no funciona en todos los casos, pero es un comienzo.
Stan
Comento el 19/06/07 a las 07:47 pm
@Esparta: Pense en eso que mencionas del "else" pero no probe si funcionaria o no. Gracias por el dato. Quieres decir que no era necesario colocar el "else" y unicamente el primer "if".
Sobre las expresiones regulares no intente.
@Hermann: Siena algo complicado para mi entender a primera vista que significa toda esa linea que pusiste, pero creeme que voy a investigar la funcion que usas, para entenderla y por supuesto probar si funciona. Gracias por el aporte.
pecesama
Comento el 21/06/07 a las 08:19 pm
Orale man quien sabe que le pasa al greader que no me actualiza tu blog, llegue tarde a los comentarios, pero veo que ya tuviste mucha retroalimentacion :)
Esparta Palma
Comento el 22/06/07 a las 04:33 am
Asi es Stan, realmente no hace nada ese else, según veo asigna a $www el valor de $www, lo que equivale a no hacer nada.
Stan
Comento el 22/06/07 a las 01:58 pm
@Pecesama: Asi es man, que raro lo del greader. Estoy revisando las otras alternativas. Pero el trabajo no me ha dado oportunidad de terminar de revisarlas, espero para el lunes tener todo en orden.
@Esparta: Gracias por la aclaracion :D
Paul Lopez
Comento el 25/06/07 a las 05:04 pm
yo apoyo a Diego.
Paul Lopez
Comento el 25/06/07 a las 05:05 pm
oye stan por cierto tu server esta a 2 horas de diferencia.. eso tambien lo puedes solucionar para que la hora del posteo sea menos 2 horas.
Octavio Alvarez
Comento el 26/06/07 a las 12:54 pm
Sí hace: desperdicia recursos.
Stan
Comento el 26/06/07 a las 01:47 pm
@Paul: Tanto tiempo sin saber de ti man, si tengo un problema con el tiempo, que es el segundo detalle que pienso atender del blog.
@Octavio: jajaja, asi es, desperdiciar recursos.
Miguel
Comento el 27/06/07 a las 12:12 pm
Hola, esta muy bueno el diseño de tu blog, me gusta mucho... Ese problema yo lo habia resuelto de igual manera en mi blog, pero tengo un problema que no he podido resolver, agradeceria mucho que me pudieras ayudar...
Te pongo un poco en contexto, aprendí un poco de PHP-MySql y CSS, no soy muy experto, pero me avente a programar mi blog, y el problema que tengo es que me llegan comentarios de este tipo: http://pisha.stan.com.mx/index.php?idpost=1#88, en las primeras ocasiones salian con un [url=http://www.....] y con funciones de cadenas de PHP valide que si aparecia "[url=http://" como subcadena en el comentario que no admitiera el comentario, pero luego me mando con esto "[URL=http://" (notese las mayusculas) y lo valide nuevamente, pero ahora me envia comentarios sin esa subcadena, pero que igual son basura, como el de la dirección que te puse anteriormente, supongo que ya has tenido ese problema y te agradecería que me dieras un consejo para evitar estos comentarios que me da mucha flojera estar siempre eliminando.
Los primeros comentarios que me llegaban eran como estos http://m25tp.webcindario.com/blog.php?idPost=26#comentario
Saludos!!
Stan
Comento el 28/06/07 a las 11:05 am
@Miguel: Lo que uso en el blog es un filtro de palabras, pero como no es suficiente, tambien coloque un campo oculto para los robots.
Si gustas puedo pasarte el filtro que uso, es bastante sencillo, nada del otro mundo. Mandame un correo y con gusto te lo paso.
Miguel
Comento el 28/06/07 a las 01:56 pm
Si, me gustaria que ver y usar el filtro, mi dirección de correo es la del campo Email, pero aquí también la pongo mg.manzarek [at] gmail.com
Stan
Comento el 28/06/07 a las 03:35 pm
@Miguel: Te agregare a mi gtalk y en una oportunidad que tenga, te enviare el codigo.
pecesama
Comento el 28/06/07 a las 10:48 pm
Miguel te paso donde puedes encontrar el filtro del que habla Stan, por si el anda ocupado: Filtro de palabras con PHP
Octavio
Comento el 29/06/07 a las 08:38 pm
Stan, ¿cómo funciona el campo oculto, y qué tan efectivo es? Saludos.
Stan
Comento el 02/07/07 a las 11:28 am
@Octavio: Es un campo oculto que tengo con una palabra determinada, la cual cambio cada cierto tiempo. Los robots siempre buscan llenar todos los campos, por lo cual modifican la palabra que tengo en ese cambio y cuando le dan publicar, termino redireccionandolos a otros lado, por no tener la palabra que solicito en dicho campo.
Funciona, ya que de tener 300 spam diarios, he bajado la cuota a unos 5 diarios o menos. Y tengo ya varios meses asi.
pablasso
Comento el 12/07/07 a las 10:49 pm
La solución de Hermann es la mejor por mucho, puedes hacerla flexible para diferentes casos como el que mencionan de 'https', talvez se te haga un poco enredosa porque contiene bastantes slashes para escapar las diagonales.
En realidad por lo que te estas centrando es por obtener el match que se obtiene de lo que esta entre parentesis, y que esta precedido por 'http' (siendo la 's' opcional) que es cualquier caracter válido en una url (letras, guiones, puntos), si existe se guarda como el primer elemento en el arreglo de matchs, sino existe, solo se guarda el match cero que es la cadena original que le pasaste.
Las expresiones regulares no son tan complicadas, solo no son muy amigables a primera vista, en cambio son muy útiles.
mario romero
Comento el 13/07/07 a las 11:08 am
en lo personal las regexs me dan dolor de cabeza asi que aqui te mando mi solucion. saludos!
function darformatolink($url) {
$linkbase = $url;
$remhttp = substr($linkbase, 8);
if($remhttp = 'https://')
$linkbase = substr($linkbase, 8);
else {
$remhttp = substr($linkbase, 7);
if($remhttp = 'http://')
$linkbase = substr($linkbase, 7);
}
$remwww = substr($linkbase, 4);
if($remwww=='www.')
$linkbase = substr($linkbase, 4);
$remslash = substr($linkbase, -1);
if($remslash=='/')
$linkbase = substr($linkbase, -1);
return $linkbase;
}
mario romero
Comento el 13/07/07 a las 11:11 am
cuidado, un error por ahi con = envez de == pero se entiende ja
Stan
Comento el 13/07/07 a las 04:15 pm
@Pablasso: Gracias por la explicacion man, de hecho por el momento he dejado las cosas como las hice, por falta de tiempo, pero este fin de semana estare aplicando y probando lo mencionado.
@Mario: Agradezco tu funcion, de igual manera la estare revisando :D