Мне нужно проверить, действительна ли данная строка. Для меня все следующие и любые другие подобные комбинации являются действительными 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), но они не сработали.
Заранее спасибо.
Работает как положено 3v4l.org/LpLl2www.example.com нет URL-адреса, потому что это имя хоста.
Спецификация URL-адреса: datatracker.ietf.org/doc/html/rfc1738
@MarkusZeller Тогда какое регулярное выражение может удовлетворить это?
Почему регулярное выражение? Если URL-адрес не работает, добавьте протокол и проверьте еще раз. 3v4l.org/oX2as
Вам следует воспользоваться предложением @MarkusZeller. Создать регулярное выражение для чего-то подобного не так просто, как может показаться на первый взгляд. Существует много вариантов, и вам нужно знать не только какие символы допустимы, но и где в URL-адресе они допустимы. Люди потеряли рассудок из-за меньшего.
Вы не описали правила, что совпадать, а что не совпадать. Все, что вы привели, это несколько примеров. В этих примерах простой поиск точки даст вам правильный ответ.
@MarkusZeller, пожалуйста, добавьте свой ответ, чтобы принять его
Пожалуйста, не изобретайте собственное определение «действительного» URL. Сначала начните с обработки строки в UriInterface (см. php-fig.org/psr/psr-7). Затем, если вы хотите наложить дополнительные ограничения на результирующий действительный URL-адрес, сделайте это явно.






Это очень простой пример проверки шаблонов 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)
Как уже говорилось в комментариях, не рекомендуется использовать регулярное выражение, проверка которого может оказаться сложной для проверки всех правил, или писать собственные функции, то есть с отсутствующей проверкой кодировок.
По возможности используйте хорошо известные и проверенные функции 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
Не работает - это описание вашей проблемы?