Проверка наличия http в веб-адресе
Вопрос
У меня есть люди, публикующие адреса своих веб-сайтов, но публикуются такие варианты, как:
- ихсайт.com
- www.ихсайт.com
- http://ихсайт.com
- http://www.theirsite.com
Когда я ссылаюсь на адрес без http://, ссылка воспринимается как внутренняя.
<a href="theirsite.com">their site</a>
отправка людей на что-то вроде: http://mysite.com/thiersite.com
Другой вариант, который я попробовал, - это ссылка на что-то вроде mysite.com/?link=theirsite.com. Таким образом я могу отслеживать ссылки и т. д., а затем перенаправлять людей на ссылку, но возникает та же проблема:
//do some tracking etc here
$link =$_GET['link'];
header("Location: $link");
Решение
Здесь нет необходимости использовать регулярные выражения.PHP имеет встроенную проверку URL-адресов.
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));
Выход
bool(true)
bool(true)
bool(false)
bool(false)
Пожалуйста, не переходите сразу к регулярным выражениям для проверки: в PHP имеется множество встроенных методов для работы с такими сценариями.
-Мэтью
Другие советы
по умолчанию введите «http://» в поле, затем подтвердите URL-адрес чем-то вроде
if(eregi("^((http|https)://)?([[:alnum:]-])+(\.)([[:alnum:]]){2,4}([[:alnum:]/+=%&_.~?-]*)$", stripslashes(trim($_POST['link'])))){
//link is valid
}
если ссылка не подтверждается, просто распечатайте им сообщение: «Введенная вами ссылка недействительна, убедитесь, что она начинается с «http://»»
Обратите внимание: существует реальная разница между www.site.com
и site.com
, обычно оба работают, но на некоторых веб-сайтах каждый ведет к разному пути (некоторые плохо определенные веб-сайты не будут работать без www
например).Поэтому вы не всегда можете добавлять к вводу «www».
Еще одно замечание: обрабатывайте добавление пробела, чтобы ' http://'
не будет предваряться дополнительными http://
.
Мое решение на основе Javascript Regex
'http://'+field.replace(/^ *http:\/\//,'')
Вы можете убедиться в этом по размеру клиента, просто поместив код в аналогичном духе на onSubmit
вашей формы.
Я бы использовал что-то вроде этого:
$link = str_replace(array("\r", "\n"), '', trim($link));
if (!preg_match('/^https?:\/\//', $link)) {
$link = 'http://'.$link;
}
header('Location: '.$link);
Другим способом было бы parse_url
функция чтобы проанализировать данный URL-адрес, посмотреть, каких частей не хватает, и добавить их.
Я бы предоставил некоторую проверку или санацию.Используйте регулярное выражение, чтобы увидеть, начинается ли с него http://.Если это не так, либо выдайте ошибку проверки, либо поставьте http:// в начале.
if not "://" in users_url:
users_url = "http://" + users_url
...или эквивалент на выбранном вами языке.
Вы можете использовать регулярные выражения для проверки ввода
Regex exp = new Regex(
@"http://(www\.)?([^\.]+)\.com",
RegexOptions.IgnoreCase);