Вы проверяете две вещи одним и тем же регулярным выражением:
- Хорошо сформирован - это синтаксически правильно?
- Правдоподобно - правдоподобно ли протокол и домен верхнего уровня?
Разделение этих проверок может быть плодотворным. Вы можете использовать это регулярное выражение, чтобы убедиться, что URI правильно сформирован. Это из RFC 3986, унифицированные идентификаторы ресурса (URI): общий синтаксис , приложение B (стр. 50):
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
Если URI соответствует этому регулярному выражению, оно правильно сформировано. Группы матчей дают вам различные части, которые:
scheme = $2
authority = $4
path = $5
query = $7
fragment = $9
Давайте посмотрим, что получится из приведенного вами примера URI:
2 (scheme) : "http"
4 (authority): "somedomain.com"
5 (path) : "/users/1234/images/Staff%20Photos%202008/FirstName%20LastName_1%20(Small).jpg"
7 (query) : nil
9 (fragment) : nil
Теперь, когда у вас есть отдельные части, вы можете проверить каждую из них на достоверность. Например, чтобы получить TLD от органа, примените к органу следующее регулярное выражение:
\.([^.])$
Группа 1 предоставляет вам ДВУ (com, org и т. Д.), Которые вы затем можете проверить в своем списке.