Asegurarse de que http aparezca en una dirección web
Pregunta
Tengo personas que publican la dirección de su sitio web, pero se publican variaciones como:
- susitio.com
- www.susitio.com
- http://susitio.com
- http://www.theirsite.com
Cuando me vinculo a una dirección sin http://, el enlace se toma como interno
<a href="theirsite.com">their site</a>
enviar personas a algo como: http://mysite.com/thiersite.com
Otra opción que he probado es vincular a algo como mysite.com/?link=theirsite.com. De esta manera puedo hacer un seguimiento de enlaces, etc. y luego redirigir a las personas al enlace, pero tiene el mismo problema:
//do some tracking etc here
$link =$_GET['link'];
header("Location: $link");
Solución
No es necesario usar expresiones regulares aquí. PHP tiene validación de URL integrada.
var_dump((bool) filter_var('http://www.website.com', FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED));
var_dump((bool) filter_var('http://website.com', FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED));
var_dump((bool) filter_var('www.website.com', FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED));
var_dump((bool) filter_var('website.com', FILTER_VALIDATE_URL, FILTER_FLAG_HOST_REQUIRED));
Salida
bool(true)
bool(true)
bool(false)
bool(false)
Por favor, no salte directamente a las expresiones regulares para la validación, PHP tiene muchos métodos integrados para lidiar con estos escenarios.
-Mathew
Otros consejos
poner " http: // " en el campo de forma predeterminada, luego valide la URL con algo como
if(eregi("^((http|https)://)?([[:alnum:]-])+(\.)([[:alnum:]]){2,4}([[:alnum:]/+=%&_.~?-]*)$", stripslashes(trim($_POST['link'])))){
//link is valid
}
si el enlace no se valida, simplemente imprímales un mensaje que diga " el enlace que ingresó no es válido, asegúrese de que comience con 'http: //' "
Tenga en cuenta que existe una diferencia real entre www.site.com
y site.com
, normalmente ambos funcionan, pero en algunos sitios web cada uno conduce a una ruta diferente (algunos sitios web mal definidos no funcionarán sin el www
por ejemplo).Por lo tanto, no siempre puedes anteponer 'www' a la entrada.
Otra nota, maneje el espacio antepuesto, para que ' http://'
no se antepondría con adicionales http://
.
Mi solución basada en Javascript Regex
'http://'+field.replace(/^ *http:\/\//,'')
Puede verificar eso en el tamaño del cliente, simplemente coloque un código con un espíritu similar en el onSubmit
de tu forma.
Usaría algo como esto:
$link = str_replace(array("\r", "\n"), '', trim($link));
if (!preg_match('/^https?:\/\//', $link)) {
$link = 'http://'.$link;
}
header('Location: '.$link);
Otra forma sería parse_url
función para analizar la URL dada, ver qué partes son falta y agrégalos.
Proporcionaría alguna validación o saneamiento. Use una expresión regular para ver si http: // comienza con ella. Si no es así, arroje un error de validación o coloque http: // al comienzo.
if not "://" in users_url:
users_url = "http://" + users_url
... o equivalente, en el idioma que elija.
Puede usar expresiones regulares para probar la entrada
Regex exp = new Regex(
@"http://(www\.)?([^\.]+)\.com",
RegexOptions.IgnoreCase);