Question

J'ai des gens qui affichent l'adresse de leur site Web, mais des variantes sont publiées telles que:

Lorsque je fais un lien vers une adresse sans http: //, le lien est pris en interne

<a href="theirsite.com">their site</a>

envoyer des personnes à quelque chose comme: http://mysite.com/thiersite.com

Une autre option que j'ai essayée est de créer un lien vers quelque chose comme mysite.com/?link=theirsite.com. Ainsi, je peux faire du suivi de lien, etc., puis rediriger les gens vers le lien, mais le problème est le même:

//do some tracking etc here
$link =$_GET['link'];
header("Location: $link");
Était-ce utile?

La solution

Pas besoin d'utiliser des expressions régulières ici. PHP a une validation d'URL intégrée.

Variables de filtre

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

Sortie

bool(true)
bool(true)
bool(false)
bool(false)

S'il vous plaît, ne passez pas directement aux expressions régulières pour la validation, PHP dispose de nombreuses méthodes intégrées pour gérer ces scénarios.

-Mathew

Autres conseils

mettez " http: // " dans le champ par défaut, puis validez l'URL avec quelque chose comme

if(eregi("^((http|https)://)?([[:alnum:]-])+(\.)([[:alnum:]]){2,4}([[:alnum:]/+=%&_.~?-]*)$", stripslashes(trim($_POST['link'])))){
    //link is valid
}

si le lien ne valide pas, imprimez-lui simplement un message disant & "le lien que vous avez entré est invalide, assurez-vous qu'il commence par" http: // ""

Veuillez noter qu'il existe une réelle différence entre www.site.com et site.com , généralement les deux fonctionnent, mais sur certains sites Web, chacun conduit à un chemin différent ( certains sites Web mal définis ne fonctionneront pas sans www , par exemple). Donc, vous ne pouvez pas toujours ajouter 'www' à l'entrée.

Autre remarque, gérez les espaces réservés aux précharges afin que 'http: //' ne soit pas précédé de http: // .

Ma solution basée sur Javascript Regex

'http://'+field.replace(/^ *http:\/\//,'')

Vous pouvez vérifier cela sur la taille du client, il suffit de mettre un code dans un esprit similaire sur le onSubmit de votre formulaire.

Je voudrais utiliser quelque chose comme ceci:

$link = str_replace(array("\r", "\n"), '', trim($link));
if (!preg_match('/^https?:\/\//', $link)) {
    $link = 'http://'.$link;
}
header('Location: '.$link);

Vous pouvez également utiliser la fonction parse_url pour analyser l'URL donnée. , voyez quelles pièces sont manquantes et ajoutez-les.

Je fournirais un peu de validation ou d’assainissement. Utilisez une expression régulière pour voir si http: // commence par elle. Si ce n'est pas le cas, lancez une erreur de validation ou mettez http: // au début.

if not "://" in users_url:
    users_url = "http://" + users_url

... ou l'équivalent, dans la langue de votre choix.

Vous pouvez utiliser des expressions régulières pour tester les entrées

Regex exp = new Regex(
    @"http://(www\.)?([^\.]+)\.com",
    RegexOptions.IgnoreCase);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top