Категория:
Опубликовано:

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&param2=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"
}

Успехов!

Если у Вас возникли вопросы, замечания, предложения или просто благодарность - пишите в комментариях.
Делитесь полезными материалами в социальных сетях.
Добавить комментарий