Вопрос или проблема
Можно ли модифицировать текущий 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';
Разберем данное регулярное выражение:
^(https?:\/\/)?
— Эта часть проверяет наличие протокола (HTTP или HTTPS). Она является необязательной.(\*[a-z0-9-]*\.)?
— Возможное вхождение поддомена, где поддомен начинается с*
(wildcard), за которым следует набор символов (буквы, цифры или дефис) и точка.[a-z0-9-]+
— Основной домен, состоящий из букв, цифр и дефисов.(\.[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 с подстановочными знаками в поддоменах и доменах верхнего уровня, что делает вашу логику более гибкой и полной.