2012-02-13 4 views

答えて

19

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を返す必要があります。実際にはそうではありません。

+0

すばらしい答え!ありがとう。それが私のためにうまくいくことが最も重要です。 – Stas

1

NSUrlを作成して、それがnil以外の結果を返すかどうかを確認してください。

+0

..ちょうど右の構文を必要とする: 場合([NSURL urlWithString:urlString]!= nilを){ } をが、何らかの理由で、それはちょうど私に私の文字列を返します! (文字列が有効なURLでない場合は、nilを返さなければならないと言っていますが) – Stas

0
if ([NSURL URLWithString:text]) { 
    // valid URL 
} 
else { 
    // invalid URL 
} 
+0

それはうまくいきません...私は奇妙なバグに出会ったのですか? ? 私はNSLog(@ "無効なURL:%@"、[NSURL URLWithString:urlString])のログを持っています。そして、それは私に表示されます: 無効なURL:img/playgrounds.png – Stas

+3

これはあなたがあなたの質問で既に試したことを言うべき理由です。あなたの文字列が文字通り "img/playgrounds.png"の場合は正しいです。それは有効なURLではありません。 'http:// img.ly/playground.png'と試してみるとうまくいきます。 –

6
+ (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); 
} 
+0

これは動作します。ありがとう – kevinl

7

私は明らかに正規表現のチェックよりも良いとそれほど複雑チェックです。このソリューションを使用 -

- (BOOL)isURL:(NSString *)inputString 
{ 
    NSURL *candidateURL = [NSURL URLWithString:inputString]; 
    return candidateURL && candidateURL.scheme && candidateURL.host; 
} 
関連する問題