Domanda

Ho persone che pubblicano il loro indirizzo del sito Web ma le varianti sono pubblicate come:

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");
È stato utile?

Soluzione

Non c'è bisogno di usare espressioni regolari qui. PHP ha la convalida dell'URL integrata.

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

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top