Категория:
Опубликовано:
Regex - регулярка для валидации URL
Словил себя на мысли, что постоянно сочиняю регулярки для поиска всяческих ссылок.
Запишу-ка, чтоб было откуда копипастить в следующий раз.
Чтоб нагляднее получилось, реализуем функцию-валидатор, с помощью которой можно будет проверять возможные URL-адреса.
/**
* Validate international link.
*
* @param string $link Link to validate.
*
* @return array
*/
function validate_url($link) {
$link = trim($link);
$pattern = '/^((?:https?\:)?(?:\/{2})?)?((?:[\w\d-_]{1,64})\.(?:[\w\d-_\.]{2,64}))(\:\d{2,6})?((?:\/|\?|#|&){1}(?:[\w\d\S]+)?)?$/u';
preg_match($pattern, $link, $matches);
if ($matches) {
unset($matches[0]);
$matches[1] = $matches[1] ?: '//';
$count = count($matches);
$matches = array_filter($matches, function ($v) use ($link, $count) {
return trim($v);
});
}
return $matches;
}
Данная процедура возвращает массив из имеющихся в адресе элементов:
- Протокол
- Хост
- Порт
- Путь
Или пустой массив, если вхождения не найдены.
Если протокол не указан - подставляет универсальный //
.
Старался учесть все возможные варианты написания:
https://sub.example.com/path/to/page?param1=value1¶m2=value2#to_anchor
http://sub.example.com
//sub.example.com
sub.example.com
Использовать можно так:
$link = 'sub.example.com';
if (!$valid_link = validate_url($link)) {
// Действия если ссылка не валидна
} else {
// Собираем ссылку заново (для добавления протокола)
$link = implode($valid_link); // на выходе - "//sub.example.com"
}
Успехов!
Делитесь полезными материалами в социальных сетях.