Изменить регулярное выражение, чтобы разрешить IP-адрес при проверке URL? - PullRequest
8 голосов
/ 24 ноября 2011

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

preg_match('/^(http(s?):\/\/)?(www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$/i', $url);

Мне нравится изменять эту часть [a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3}) (по крайней мере, я надеюсь, что это жирная часть), чтобы она была либо IP-адресом, либо выделенной частью.

На данный момент регулярное выражение довольно хорошо для меня, так как оно правильно находит неправильные URL-адреса - хотя я считаю, что оно начнет работать неправильно после того, как новая политика домена от ICANN будет запущена (т. Е. Google может захотеть получить url http://search.google - вместо http://google.com для поиска)

Как бы то ни было, я бы хотел добавить возможность, чтобы IP-адреса также были действительными URL-адресами, но я не уверен, как включить это в регулярное выражение

Если бы кто-нибудь мог протянуть руку, это было бы здорово!

Ответы [ 2 ]

9 голосов
/ 24 ноября 2011

Это регулярное выражение работает:

^(http(s?):\/\/)?(((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+)|(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b))(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$

В разделе после проверки "http" он просто выполняет операцию ИЛИ, чтобы сопоставить имя домена или IP.Вот соответствующая выдержка:

((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+)|(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b)

Выражение IP несколько длинное, но оно гарантирует, что это действительный IP (как, например, 999.999.999.999).Вы можете легко заменить его на другую проверку IP.

Здесь это включено в ваш предыдущий код:

preg_match('/^(http(s?):\/\/)?(((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+)|(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b))(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$/i', $url);
2 голосов
/ 02 октября 2012

Два очка. Домены верхнего уровня уровня теперь кажутся не более 6 символов (музей), поэтому мы должны учитывать это:

^(http(s?):\/\/)?(((www\.)?+[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,6})+)|(\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b))(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$

В языках на основе C нам нужно избегать этих \

char *regex = "/^(http(s?):\\/\\/)?(www\\.)?+[a-zA-Z0-9\\.\\-\\_]+(\\.[a-zA-Z]{2,6})+(\\/[a-zA-Z0-9\\_\\-\\s\\.\\/\\?\\%\\#\\&\\=]*)?$/i";

В задаче C мы можем определить метод Category для NSString:

- (BOOL)isURL
{
    // uses ICU regex syntax http://userguide.icu-project.org/strings/regexp
    NSString *regex = @"^(http(s?)://)?(www\\.)?+[a-zA-Z0-9\\.\\-_]+(\\.[a-zA-Z]{2,6})+(/[a-zA-Z0-9_\\-\\s\\./\\?%#\\&=]*)?$";

    NSPredicate *regextest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    return [regextest evaluateWithObject:self];
}

Обратите внимание, что это решение полностью игнорирует IPv6!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...