Улучшение шаблона регулярного выражения для проверки также IPv6 / punycode / чужих доменных имен

Возможный дубликат:
Проверка / регулярное выражение PHP для URL-адреса
Как проверить доменное имя с помощью Regex и Php ?

В настоящее время я использую этот шаблон регулярного выражения для проверки доменных имен перед их добавлением в мою базу данных:

$pattern = '/^https?:\/\/([a-zA-Z0-9_\-]+:[^\s@:]+@)?((([a-zA-Z][a-zA-Z0-9\-]+\.)+[a-zA-Z\-]+)|((2(5[0-5]|[0-4][0-9])|[01][0-9]{2}|[0-9]{1,2})\.(2(5[0-5]|[0-4][0-9])|[01][0-9]{2}|[0-9]{1,2})\.(2(5[0-5]|[0-4][0-9])|[01][0-9]{2}|[0-9]{1,2})\.(2(5[0-5]|[0-4][0-9])|[01][0-9]{2}|[0-9]{1,2})))(:[0-9]{1,5})?(\/[!~*\'\(\)a-zA-Z0-9;\/\\\?:\@&=\+\$,%#\._-]*)*$/';

Этот шаблон разрешает поддомены, строки ipv4 и т. Д. Поскольку это для каталога, он не разрешает строки, которые обычно действительны, такие как http://localhost, но в любом случае мне нужно добавить поддержку строк IP ipv6, а также международных доменных имен. например, müller.com

В настоящее время я использую:

$url = "http://müller.com/"
if(preg_match($pattern,$url)) {
echo "valid";
} else {
echo "invalid";
}

и он проверяет почти все, что я хочу, чтобы он проверял, кроме адресов ipv6 и иностранных символов.

Интересно, сможет ли кто-нибудь придумать эти два дополнения, потому что они действительно сделают мой день. Имейте в виду, что я новичок в PHP, поэтому, пожалуйста, не бросайтесь в меня чем-то. Вместо этого было бы гораздо полезнее, если бы вы могли показать мне рабочий пример и объяснить, что вы добавили.

Возможно, перед проверкой требуется преобразовать посторонний материал в действительный URL-адрес punycode, а затем разрешить использование punycode. Я открыт для предложений.

Большое вам спасибо - ваша помощь очень ценится

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

Я ищу то, что у меня есть, но дополнительно поддерживает IP-строки ipv6 и имена punycode / международные имена.


person Marcus Weller    schedule 09.10.2012    source источник
comment
FILTER_VALIDATE_URL для _ 2_.   -  person DaveRandom    schedule 09.10.2012
comment
Я нашел ОГРОМНОЕ регулярное выражение для адресов IPv6 здесь. Кажется, это регулярное выражение для всех случаев. Вы можете легко найти более слабые версии в Интернете, если считаете, что вам не нужно так глубоко проверять адреса. В любом случае вам нужно взять одно из этих регулярных выражений и поместить его в текущее регулярное выражение следующим образом: ...{2}|[0-9]{1,2}))|<HERE>)(:[0-9]{1,5})?...   -  person Carlos    schedule 09.10.2012