Регулярное выражение для проверки URL с поддоменом и доменом верхнего уровня

Вопрос или проблема

Можно ли модифицировать текущий php regex, чтобы он позволял '*example.*'?

$wildcardUrlPattern = '/^(https?:\/\/)?(\*[a-z0-9-]*\.)?[a-z0-9-]+(\.[a-z0-9-]*)*(\.\*[a-z0-9-]*)?$/i';

// Тестовые URL
$urls = [
    'example.*',      // Домен с подстановочным знаком TLD
    '*example.com',   // Подстановочный домен с фиксированным TLD
    '*.example.*',    // Подставочный субдомен с подстановочным TLD
    '*.example.com',  // Подставочный субдомен с фиксированным TLD
    '*example.*',     // Подстановочный домен с подстановочным TLD
    'http://example.*', // Протокол с доменом и подстановочным TLD
    'http://*example.com' // Протокол с подстановочным доменом и фиксированным TLD
];

foreach ($urls as $url) {
    if (preg_match($wildcardUrlPattern, $url)) {
        echo "$url: Действующий URL с подстановочным знаком\n";
    } else {
        echo "$url: Неверный URL\n";
    }
}

Результат:

example.*: Действующий URL с подстановочным знаком
*example.com: Действующий URL с подстановочным знаком
*.example.*: Действующий URL с подстановочным знаком
*.example.com: Действующий URL с подстановочным знаком
*example.*: Неверный URL (должен быть также действующим)
http://example.*: Действующий URL с подстановочным знаком
http://*example.com: Действующий URL с подстановочным знаком

Как насчет этого?

/^(?:https?:\/\/)?[a-z0-9-\.*]+$/i

Посмотрите, как это работает на regex101, хотя обратите внимание, что для целей тестирования я включил флаг /m, чтобы ^ и $ соответствовали началу и концу каждой строки (а не началу и концу строки), и флаг /g, чтобы находить все совпадения.

Ответ или решение

Ваша задача состоит в том, чтобы создать регулярное выражение (regex), которое могло бы проверять URL с возможностью использования подстановочных знаков (wildcards) как для поддоменов, так и для доменов верхнего уровня (TLD). Давайте разберемся, как это можно сделать.

На основании вашего текущего регулярного выражения и тестовых URL, предлагаю следующее решение:

$wildcardUrlPattern = '/^(https?:\/\/)?(\*[a-z0-9-]*\.)?[a-z0-9-]+(\.[a-z0-9-]*|\.\*)+$/i';

Разберем данное регулярное выражение:

  1. ^(https?:\/\/)? — Эта часть проверяет наличие протокола (HTTP или HTTPS). Она является необязательной.
  2. (\*[a-z0-9-]*\.)? — Возможное вхождение поддомена, где поддомен начинается с * (wildcard), за которым следует набор символов (буквы, цифры или дефис) и точка.
  3. [a-z0-9-]+ — Основной домен, состоящий из букв, цифр и дефисов.
  4. (\.[a-z0-9-]*|\.\*)+ — Часть, отвечающая за домены верхнего уровня. Здесь будет либо буквенно-цифровое доменное имя, либо * (wildcard). Убеждаемся, что TLD является обязательным и может включать неоднократные точки, что позволяет писать поддомены следующего уровня (например, в случае com.au).

С использованием приведенного регулярного выражения, вы можете протестировать следующие URL:

$urls = [
    'example.*',      // Домен с подстановочным знаком TLD
    '*example.com',   // Подстановочный домен с фиксированным TLD
    '*.example.*',    // Подстановочный поддомен с подстановочным TLD
    '*.example.com',  // Подстановочный поддомен с фиксированным TLD
    'http://example.*', // Протокол с доменом и подстановочным TLD
    'http://*example.com' // Протокол с подстановочным доменом и фиксированным TLD
];

foreach ($urls as $url) {
    if (preg_match($wildcardUrlPattern, $url)) {
        echo "$url: Действительный URL с подстановочным знаком\n";
    } else {
        echo "$url: Недействительный URL\n";
    }
}

Ожидаемый результат:

example.*: Действительный URL с подстановочным знаком
*example.com: Действительный URL с подстановочным знаком
*.example.*: Действительный URL с подстановочным знаком
*.example.com: Действительный URL с подстановочным знаком
http://example.*: Действительный URL с подстановочным знаком
http://*example.com: Действительный URL с подстановочным знаком

Обратите внимание, что ваше изначальное выражение не позволяет в некоторых случаях правильный формат (например, когда у вас *example.*), а предложенное выражение это исправит.

Таким образом, это регулярное выражение будет принимать URL с подстановочными знаками в поддоменах и доменах верхнего уровня, что делает вашу логику более гибкой и полной.

Оцените материал
Добавить комментарий

Капча загружается...