Действительный URL-адрес PHP, включая поддомены, а также подпути

Мне нужно проверить, действительна ли данная строка. Для меня все следующие и любые другие подобные комбинации являются действительными URL-адресами.

'https://example.com/api/',
'https://www.example.com/test-subpath',
'https://www.example.com',
'example.com/test/page',
'www.example.com',
'www.subdomain.example.com',
'https://www.subdomain.example.com',
'subdomain.example.com',
'http://subdomain.example.com',
'https://subdomain.example.com'

пока

'user-service/api/'

является недействительным. Я пробовал методы parse_url() и filter_var($url, FILTER_VALIDATE_URL), но они не сработали.

Заранее спасибо.

Не работает - это описание вашей проблемы?

Markus Zeller 06.07.2024 10:40

Работает как положено 3v4l.org/LpLl2www.example.com нет URL-адреса, потому что это имя хоста.

Markus Zeller 06.07.2024 10:44

Спецификация URL-адреса: datatracker.ietf.org/doc/html/rfc1738

Markus Zeller 06.07.2024 10:45

@MarkusZeller Тогда какое регулярное выражение может удовлетворить это?

M a m a D 06.07.2024 10:49

Почему регулярное выражение? Если URL-адрес не работает, добавьте протокол и проверьте еще раз. 3v4l.org/oX2as

Markus Zeller 06.07.2024 11:34

Вам следует воспользоваться предложением @MarkusZeller. Создать регулярное выражение для чего-то подобного не так просто, как может показаться на первый взгляд. Существует много вариантов, и вам нужно знать не только какие символы допустимы, но и где в URL-адресе они допустимы. Люди потеряли рассудок из-за меньшего.

M. Eriksson 06.07.2024 11:43

Вы не описали правила, что совпадать, а что не совпадать. Все, что вы привели, это несколько примеров. В этих примерах простой поиск точки даст вам правильный ответ.

Brett Donald 06.07.2024 11:53

@MarkusZeller, пожалуйста, добавьте свой ответ, чтобы принять его

M a m a D 07.07.2024 09:25

Пожалуйста, не изобретайте собственное определение «действительного» URL. Сначала начните с обработки строки в UriInterface (см. php-fig.org/psr/psr-7). Затем, если вы хотите наложить дополнительные ограничения на результирующий действительный URL-адрес, сделайте это явно.

Ulrich Eckhardt 07.07.2024 09:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
9
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это очень простой пример проверки шаблонов URL-адресов.

<?php
$re = '#example[.]com#i';
$str = 'subdomain.example.com';

preg_match($re, $str, $matches, PREG_OFFSET_CAPTURE, 0);

// Print the entire match result
var_dump($matches);
?>

Надеюсь, это поможет вам. Спасибо.

Ответ принят как подходящий

Ваш скрипт и метод фильтра работают как положено. Поскольку www.example.com — это всего лишь имя хоста и часть URL-адреса, ему необходимо вернуть false.

Определение URL гласит:

<scheme>:<scheme-specific-part>

В вашем случае вы можете применить следующий набор правил

(Демо: https://3v4l.org/oX2as)

  • Проверьте, действителен ли URL-адрес
    • да -> вернуть истину
    • нет -> добавить схему и проверить еще раз
      • да -> вернуть истину
      • нет -> проверка не удалась

Как уже говорилось в комментариях, не рекомендуется использовать регулярное выражение, проверка которого может оказаться сложной для проверки всех правил, или писать собственные функции, то есть с отсутствующей проверкой кодировок.

По возможности используйте хорошо известные и проверенные функции PHP.

$urls = [
    'https://example.com/api/',
    'https://www.example.com/test-subpath',
    'https://www.example.com',
    'example.com/test/page',
    'www.example.com',
    'www.subdomain.example.com',
    'https://www.subdomain.example.com',
    'subdomain.example.com',
    'http://subdomain.example.com',
    'https://subdomain.example.com',
];

function checkUrl(string $url): bool
{
    return (bool)filter_var($url, FILTER_VALIDATE_URL);
}

foreach ($urls as $url) {
    if (checkUrl($url)) {
        echo $url . ' is a valid URL', PHP_EOL;
        continue;
    }

    $urlWithProtocol = 'https://' . $url;
    if (checkUrl($urlWithProtocol)) {
        echo $urlWithProtocol, ' with added protocol is a valid URL', PHP_EOL;
        continue;
    }

    echo $url, ' is not a valid URL', PHP_EOL;
}

приведет к

https://example.com/api/ is a valid URL
https://www.example.com/test-subpath is a valid URL
https://www.example.com is a valid URL
https://example.com/test/page with added protocol is a valid URL
https://www.example.com with added protocol is a valid URL
https://www.subdomain.example.com with added protocol is a valid URL
https://www.subdomain.example.com is a valid URL
https://subdomain.example.com with added protocol is a valid URL
http://subdomain.example.com is a valid URL
https://subdomain.example.com is a valid URL

Другие вопросы по теме