MFC: Как мне создать хорошее регулярное выражение, которое проверяет URL? - PullRequest
2 голосов
/ 10 марта 2010

Вот регулярное выражение, которое я использую, и я анализирую его, используя CAtlRegExp MFC:

(((ч | Н) (т | Т) (т | Т) (р | Р) (с | S)):???? //)? ([A-Za-Z0-9 ] + [\.] + [A-Za-Z0-9] + [\.] + [A-Za-Z0-9])

Работает нормально, за исключением одного недостатка. Когда URL предшествует символы, он все равно принимает его как URL.

без ввода:

  • это ссылка www.google.com (где я могу просто разметить пробелы и проверить каждое слово)

  • is ... www.google.com (эта строка по-прежнему соответствует описанному выше RegEx :()

Пожалуйста, помогите ... Спасибо ...

Ответы [ 6 ]

3 голосов
/ 10 марта 2010
  1. Используйте флаг IgnoreCase вместо доставки для каждого случая.
  2. Вставьте ^ в начале, если вы хотите, чтобы начало строки было началом URL
  3. Вам не хватает лота символов из возможных, действительных URL.
2 голосов
/ 10 марта 2010

Как насчет использования CUrl (то есть C-Url в ATL, а не curl, как в libcurl), который может «анализировать» URL с помощью CUrl :: CrackUrl. Если эта функция возвращает FALSE, вы предполагаете, что это недействительный URL.

Тем не менее, декомпозиция URL достаточно сложна, чтобы гарантировать правильный синтаксический анализатор, а не декомпозицию на основе регулярных выражений. ЧФР. RFC 2396 и т. д. для обзора сложностей.

2 голосов
/ 10 марта 2010

Вы должны указать регулярному выражению совпадение только в начале и в конце строки. Я не уверен, как вы это делаете в VC ++ - в большинстве регулярных выражений вы заключаете шаблон с ^ и $. ^ говорит "начало строки", а $ говорит "конец строки".

^(((h|H?)(t|T?)(t|T?)(p|P?)(s|S?))\://)?([a-zA-Z0-9]+[\\.]+[a-zA-Z0-9]+[\\.]+[a-zA-Z0-9])$

Второй совпадает, потому что строка все еще содержит действительный URL.

1 голос
/ 10 марта 2010

Это регулярное выражение было проверено на работу для следующих

HTTP | https://host[:port]/[?][parameter=value]*

public static final String URL_PATTERN = "(https?|ftp)://(www\\.)?(((([a-zA-Z0-9.-]+\\.){1,}[a-zA-Z]{2,4}|localhost))|((\\d{1,3}\\.){3}(\\d{1,3})))(:(\\d+))?(/([a-zA-Z0-9-._~!$&'()*+,;=:@/]|%[0-9A-F]{2})*)?(\\?([a-zA-Z0-9-._~!$&'()*+,;=:/?@]|%[0-9A-F]{2})*)?(#([a-zA-Z0-9._-]|%[0-9A-F]{2})*)?";

PS. Это также проверяется на локальной ссылке.

(Тщательно написано мной: -))

1 голос
/ 10 марта 2010

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

^(((h|H?)(t|T?)(t|T?)(p|P?)(s|S?))\://)?([a-zA-Z0-9]+[\.]+[a-zA-Z0-9]+[\.]+[a-zA-Z0-9])$
1 голос
/ 10 марта 2010

А как насчет этого: (((f|ht)tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+) ?

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