Привет, я хотел бы проверить эти следующие URL-адреса, так что все они будут проходить с или без http / www-части в них, пока присутствует TLD, например .com, .net, .org и т. Д.
Допустимые URL должны быть:
http://www.domain.com http://domain.com https://www.domain.com https://domain.com www.domain.com domain.com
Для поддержки длинных tlds:
http://www.domain.com.uk http://domain.com.uk https://www.domain.com.uk https://domain.com.uk www.domain.com.uk domain.com.uk
Для поддержки тире (-):
http://www.domain-here.com http://domain-here.com https://www.domain-here.com https://domain-here.com www.domain-here.com domain-here.com
Также для поддержки номеров в доменах:
http://www.domain1-test-here.com http://domain1-test-here.com https://www.domain1-test-here.com https://domain1-test-here.com www.domain1-test-here.com domain-here.com
Также возможно разрешить даже IP-адреса:
127.127.127.127
(но это дополнительно!)
Также разрешите тире (-), забыл о том, что =)
Я нашел много функций, которые проверяют тот или иной, но не оба одновременно. Если кто-то знает хорошее регулярное выражение для этого, пожалуйста, поделитесь. Спасибо за помощь.
Для правильной проверки правильности URL.
Выше ответ прав, но не работает во всех доменах, таких как .me, .it, .in
поэтому, пожалуйста, ниже, для URL-адреса:
$pattern = '/(?:https?:\/\/)?(?:[a-zA-Z0-9.-]+?\.(?:[a-zA-Z])|\d+\.\d+\.\d+\.\d+)/'; if(preg_match($pattern, "http://website.in")) { echo "valid"; }else{ echo "invalid"; }
Когда вы игнорируете часть пути и ищете только часть домена, простое правило будет
(?:https?://)?(?:[a-zA-Z0-9.-]+?\.(?:com|net|org|gov|edu|mil)|\d+\.\d+\.\d+\.\d+)
Если вы хотите также поддерживать TLD страны, вы должны либо предоставить полный (текущий) список, либо добавить |..
в часть ДВУ.
С preg_match
вы должны обернуть его между некоторыми разделителями
$pattern = ';(?:https?://)?(?:[a-zA-Z0-9.-]+?\.(?:com|net|org|gov|edu|mil)|\d+\.\d+\.\d+\.\d+);'; $index = preg_match($pattern, $url);
Обычно вы используете /
. Но в этом случае косые черты являются частью шаблона, поэтому я выбрал другой разделитель. В противном случае я должен убежать с косой чертой с \
$pattern = '/(?:https?:\/\/)?(?:[a-zA-Z0-9.-]+?\.(?:com|net|org|gov|edu|mil)|\d+\.\d+\.\d+\.\d+)/';
Я думаю, вы можете использовать флаги для filter_vars
.
Для FILTER_VALIDATE_URL
доступно несколько флагов:
FILTER_FLAG_SCHEME_REQUIRED
Требуется, чтобы URL-адрес содержал часть схемы. FILTER_FLAG_HOST_REQUIRED
Требуется, чтобы URL-адрес содержал главную часть. FILTER_FLAG_PATH_REQUIRED
Требуется, чтобы URL-адрес содержал часть пути. FILTER_FLAG_QUERY_REQUIRED
Требуется, чтобы URL-адрес содержал строку запроса. FILTER_FLAG_SCHEME_REQUIRED
и FILTER_FLAG_HOST_REQUIRED
используются по умолчанию.
Допустим, вы хотите проверить часть пути и не хотите проверять часть схемы, вы можете сделать что-то вроде этого (falg – это битовая маска):
filter_var($url, FILTER_VALIDATE_URL, ~FILTER_FLAG_SCHEME_REQUIRED | FILTER_FLAG_PATH_REQUIRED)
Не используйте регулярное выражение. Не каждая проблема, которая включает строки, должна использовать регулярные выражения.
Не пишите свой собственный валидатор URL. Проверка правильности URL является решаемой проблемой, и существует уже существующий код, который уже был написан, отлажен и тестирован. На самом деле, он поставляется с PHP.
Посмотрите встроенную функцию фильтрации PHP: http://us2.php.net/manual/en/book.filter.php