Pregunta

Tengo personas que publican la dirección de su sitio web, pero se publican variaciones como:

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");
¿Fue útil?

Solución

No es necesario usar expresiones regulares aquí. PHP tiene validación de URL integrada.

Filter Var

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top