Assicurarsi che http venga visualizzato in un indirizzo Web
Domanda
Ho persone che pubblicano il loro indirizzo del sito Web ma le varianti sono pubblicate come:
- theirsite.com
- www.theirsite.com
- http://theirsite.com
- http://www.theirsite.com
Quando collego a un indirizzo senza http: // prende il collegamento come interno
<a href="theirsite.com">their site</a>
invio di persone a qualcosa del tipo: http://mysite.com/thiersite.com
Un'altra opzione che ho provato è il collegamento a qualcosa come mysite.com/?link=theirsite.com - In questo modo posso fare un po 'di tracciamento del link ecc. quindi reindirizzare le persone al link ma ha lo stesso problema:
//do some tracking etc here
$link =$_GET['link'];
header("Location: $link");
Soluzione
Non c'è bisogno di usare espressioni regolari qui. PHP ha la convalida dell'URL integrata.
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));
Output
bool(true)
bool(true)
bool(false)
bool(false)
Non passare direttamente alle espressioni regolari per la convalida, PHP ha molti metodi integrati per gestire questi scenari.
-Mathew
Altri suggerimenti
put " http: // " nel campo per impostazione predefinita, quindi convalida l'URL con qualcosa come
if(eregi("^((http|https)://)?([[:alnum:]-])+(\.)([[:alnum:]]){2,4}([[:alnum:]/+=%&_.~?-]*)$", stripslashes(trim($_POST['link'])))){
//link is valid
}
se il collegamento non viene convalidato, basta stamparli con un messaggio che dice " il collegamento inserito non è valido, assicurarsi che inizi con 'http: //' "
Nota, c'è una vera differenza tra www.site.com
e site.com
, di solito entrambi funzionano, ma su alcuni siti Web ognuno porta a un percorso diverso (alcuni siti Web mal definiti non funzioneranno senza www
per esempio) . Quindi non puoi sempre anteporre "www" all'input.
Un'altra nota, gestisci lo spazio prependente, in modo che ' http://'
non venga anteposto con http://
aggiuntivo.
La mia soluzione basata su Javascript Regex
'http://'+field.replace(/^ *http:\/\//,'')
Puoi verificarlo sulla dimensione del cliente, basta inserire un codice con spirito simile sul onSubmit
del tuo modulo.
Vorrei usare qualcosa del genere:
$link = str_replace(array("\r", "\n"), '', trim($link));
if (!preg_match('/^https?:\/\//', $link)) {
$link = 'http://'.$link;
}
header('Location: '.$link);
Un altro modo sarebbe la parse_url
funzione per analizzare l'URL specificato, vedere quali parti sono mancanti e aggiungerli.
Vorrei fornire un po 'di convalida o servizi igienico-sanitari. Usa una regex per vedere se http: // inizia con essa. In caso contrario, genera un errore di convalida o inserisci http: // all'inizio.
if not "://" in users_url:
users_url = "http://" + users_url
... o equivalente, nella lingua che preferisci.
È possibile utilizzare espressioni regolari per testare l'input
Regex exp = new Regex(
@"http://(www\.)?([^\.]+)\.com",
RegexOptions.IgnoreCase);