Как быстро проверить, является ли объект NSString действительным URL? - PullRequest
7 голосов
/ 13 февраля 2012

Помогите мне написать код вроде "если моя строка является допустимым URL, сделайте что-нибудь" Можно ли написать это в виде пары строк кода?

Ответы [ 5 ]

19 голосов
/ 13 февраля 2012

Я предполагаю, что по URL вы ссылаетесь на строку, определяющую местоположение интернет-ресурса.

Если у вас есть представление о формате входной строки, то почему бы не проверить вручную, начинается ли строка с http://, https:// или любой другой схемы, которая вам нужна.Если вы ожидаете другие протоколы, вы также можете добавить их в контрольный список (например, ftp://, mailto:// и т. Д.)



if ([myString hasPrefix:@"http://"] || [myString hasPrefix:@"https://"])
{
    // do something
}

Если вы ищете более твердое решение и обнаруживаете любые видыСхема URL, тогда вам следует использовать регулярное выражение.

В качестве примечания, класс NSURL предназначен для выражения любого вида расположения ресурсов (не только интернет-ресурсов).Вот почему строки типа img/demo.jpg или file://bla/bla/bla/demo.jpg могут быть преобразованы в объекты NSURL.

Однако согласно документации [NSURL URLWithString] должен возвращать nil, если входная строка не является допустимой строкой интернет-ресурса,На практике это не так.

7 голосов
/ 26 июня 2012
+ (BOOL)validateUrlString:(NSString*)urlString
{
    if (!urlString)
    {
        return NO;
    }

    NSDataDetector *linkDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];

    NSRange urlStringRange = NSMakeRange(0, [urlString length]);
    NSMatchingOptions matchingOptions = 0;

    if (1 != [linkDetector numberOfMatchesInString:urlString options:matchingOptions range:urlStringRange])
    {
        return NO;
    }

    NSTextCheckingResult *checkingResult = [linkDetector firstMatchInString:urlString options:matchingOptions range:urlStringRange];

    return checkingResult.resultType == NSTextCheckingTypeLink 
        && NSEqualRanges(checkingResult.range, urlStringRange);
}
6 голосов
/ 14 июля 2015

Я использовал это решение, которое, по-видимому, лучше и менее сложно, чем проверка Regex -

- (BOOL)isURL:(NSString *)inputString
{
    NSURL *candidateURL = [NSURL URLWithString:inputString];
    return candidateURL && candidateURL.scheme && candidateURL.host;
}
1 голос
/ 13 февраля 2012

Попробуйте создать с ним NSUrl и посмотрите, вернет ли он результат, отличный от нуля.

0 голосов
/ 13 февраля 2012
if ([NSURL URLWithString:text]) {
  // valid URL
}
else {
  // invalid URL
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...