Garantindo que aparece http em um endereço da Web
Pergunta
Eu tenho pessoas postando seu endereço na Internet, mas as variações são publicadas tais como:
- theirsite.com
- www.theirsite.com
- http://theirsite.com
- http://www.theirsite.com
Quando eu conectar-se a um endereço sem http: // leva o link como interna
<a href="theirsite.com">their site</a>
envio de pessoas para algo como: http://mysite.com/thiersite.com
Outra opção que eu tentei é ligando para algo como mysite.com/?link=theirsite.com - Dessa forma eu posso fazer alguma ligação rastreamento etc pessoas, então redirecionamento para o link, mas ele tem o mesmo problema:
//do some tracking etc here
$link =$_GET['link'];
header("Location: $link");
Solução
Não há necessidade de usar expressões regulares aqui. PHP tem validação URL embutido.
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));
saída
bool(true)
bool(true)
bool(false)
bool(false)
Por favor, não ir direto para expressões regulares para validação, PHP tem um monte de métodos internos para lidar com esses cenários.
-Mathew
Outras dicas
put "http: //" no campo por padrão, em seguida, validar a URL com algo como
if(eregi("^((http|https)://)?([[:alnum:]-])+(\.)([[:alnum:]]){2,4}([[:alnum:]/+=%&_.~?-]*)$", stripslashes(trim($_POST['link'])))){
//link is valid
}
Se o link não valida, apenas imprimir-lhes uma mensagem dizendo "o link digitado é inválido, verifique se ele começa com 'http: //'"
Por favor, note que há uma diferença real entre www.site.com
e site.com
, geralmente ambas as obras, mas em algum site cada um leva para um caminho diferente (algum site mal definidas não funcionará sem a www
por exemplo). Assim, você pode nem sempre preceder 'www' para a entrada.
Outra nota, não pega prepending espaço, de modo que ' http://'
não ser prefixado com http://
adicional.
solução baseada Meu Javascript Regex
'http://'+field.replace(/^ *http:\/\//,'')
Você pode verificar se o tamanho do cliente, basta colocar um código em espírito semelhante no onSubmit
do seu formulário.
Gostaria de usar algo como isto:
$link = str_replace(array("\r", "\n"), '', trim($link));
if (!preg_match('/^https?:\/\//', $link)) {
$link = 'http://'.$link;
}
header('Location: '.$link);
Outra forma seria a parse_url
função para analisar o URL dado, ver quais partes estão faltando e adicioná-los.
Eu iria fornecer alguma validação ou saneamento. Use um regex para ver se http: // começa com ele. Se isso não acontecer, quer lançar um erro de validação ou colocar http:. // no início
if not "://" in users_url:
users_url = "http://" + users_url
... ou equivalente, no idioma de sua escolha.
Você pode usar expressões regulares para entrada de teste
Regex exp = new Regex(
@"http://(www\.)?([^\.]+)\.com",
RegexOptions.IgnoreCase);