Довольно часто встречаются ситуации, когда нужно проверить на корректность URL-адрес, введенный пользователем. При этом, хорошо было бы не обременять самого пользователя вводом протокола http/https, но предоставить ему такую возможность.
То есть, «правильным» должен считаться, как URL, вида http://example.com/
, так и example.com
. В случае, если протокол не был указан, по умолчанию к конечному значению добавляется http://
.
Создадим функцию parse_url_if_valid
, которая будет принимать «сырую» строку URL, и возвращать корректный URL в том случае, если его удалось привести к должному виду. В противном случае, функция будет возвращать значение null
.
В PHP есть встроенная функция parse_url, которая разбирает URL-адрес и возвращает массив с его компонентами. Воспользуемся ей для облегчения задачи и уменьшения количества рутинных операций.
function parse_url_if_valid($url)
{
// Массив с компонентами URL, сгенерированный функцией parse_url()
$arUrl = parse_url($url);
// Возвращаемое значение. По умолчанию будет считать наш URL некорректным.
$ret = null;
// Если не был указан протокол, или
// указанный протокол некорректен для url
if (!array_key_exists("scheme", $arUrl)
|| !in_array($arUrl["scheme"], array("http", "https")))
// Задаем протокол по умолчанию - http
$arUrl["scheme"] = "http";
// Если функция parse_url смогла определить host
if (array_key_exists("host", $arUrl) &&
!empty($arUrl["host"]))
// Собираем конечное значение url
$ret = sprintf("%s://%s%s", $arUrl["scheme"],
$arUrl["host"], $arUrl["path"]);
// Если значение хоста не определено
// (обычно так бывает, если не указан протокол),
// Проверяем $arUrl["path"] на соответствие шаблона URL.
else if (preg_match("/^\w+\.[\w\.]+(\/.*)?$/", $arUrl["path"]))
// Собираем URL
$ret = sprintf("%s://%s", $arUrl["scheme"], $arUrl["path"]);
// Если url валидный и передана строка параметров запроса
if ($ret && empty($ret["query"]))
$ret .= sprintf("?%s", $arUrl["query"]);
return $ret;
}
Теперь проверить корректность URL‐адреса, который ввел пользователь — проще простого.
if (!empty($_POST['site-url']) {
$url = parse_url_if_valid($_POST['site-url']);
if (!$url) {
// Введен некорректный URL
echo "Введите валидный адрес сайта";
exit();
} else {
// Работаем с полученным значением, как нам удобно.
echo "Ваш url: " . $url;
}
}
Не забывайте должным образом обрабатывать данные, пришедшие от пользователя, если вы используете их при формировании запросов к БД. А еще лучше, переходите на prepared statements.
Комментарии к статье: 20
Возможность комментировать эту статью отключена автором. Возможно, во всем виновата её провокационная тематика или большое обилие флейма от предыдущих комментаторов.
Если у вас есть вопросы по содержанию статьи, рекомендуем вам обратиться за помощью на наш форум.