21

まず、取得しているテキストを制御できません。リンクを変更できないことを知っているように、それを公開したかっただけです。

使用中のリンクを見つけようとしているテキストにNSDataDetectorは、次のものが含まれています。

<h1>My main item</h1>
<img src="http://www.blah.com/My First Image Here.jpg">
<h2>Some extra data</h2>

私が使用している検出コードはこれですが、このリンクは見つかりません:

NSDataDetector *linkDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
NSArray *matches = [linkDetector matchesInString:myHTML options:0 range:NSMakeRange(0, [myHTML length])];

for (NSTextCheckingResult *match in matches) 
{
   if ([match resultType] == NSTextCheckingTypeLink)
   {
      NSURL *url = [match URL];
      // does some stuff
   }
}

これは、スペースを含むリンクを検出できない Apple のリンク検出のバグですか、それとも何か間違っていますか?

スペースや特殊文字などが含まれているかどうかに関係なく、リンクを検出するより信頼できる方法はありますか?

4

8 に答える 8

0

私の問題を解決するための非常にハックな方法を見つけました。すべての URL に適用できるより良い解決策を誰かが思いついた場合は、それを実行してください。

この問題がある で終わる URL のみに関心があるため.jpg、これを追跡する狭い方法を思いつくことができました。

基本的に、文字列を"http://配列に基づいてコンポーネントに分割します。次に、その配列をループして、 を探して別のブレークアウトを行い.jpg">ます。内部配列のカウントは、文字列が見つかっ> 1た場合のみになります。.jpg">次に、見つけた文字列と%20置換で修正した文字列の両方を保持し、それらを使用して元の文字列の最終的な文字列置換を行います。

完璧ではなく、おそらく非効率的ですが、私が必要としている仕事を成し遂げてくれます。

- (NSString *)replaceSpacesInJpegURLs:(NSString *)htmlString
{
    NSString *newString = htmlString;

    NSArray *array = [htmlString componentsSeparatedByString:@"\"http://"];
    for (NSString *str in array)
    {
        NSArray *array2 = [str componentsSeparatedByString:@".jpg\""];

        if ([array2 count] > 1)
        {
            NSString *stringToFix = [array2 objectAtIndex:0];
            NSString *fixedString = [stringToFix stringByReplacingOccurrencesOfString:@" " withString:@"%20"];

            newString = [newString stringByReplacingOccurrencesOfString:stringToFix withString:fixedString];
        }
    }

    return newString;
}
于 2015-06-09T21:11:55.460 に答える
0

単純な正規表現を使用してリンクを検出し、スペースをエンコードするだけですべての URL を修正できNSRegularExpressionます (より複雑なエンコードが必要な場合は、調べることができCFURLCreateStringByAddingPercentEscapes、そこにはたくさんの例があります)。以前に作業したことがない場合に時間がかかる唯一のことはNSRegularExpression、結果を反復して置換を行う方法です。次のコードでうまくいくはずです。

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"src=\".*\"" options:NSRegularExpressionCaseInsensitive error:&error];
if (!error)
{
    NSInteger offset = 0;
    NSArray *matches = [regex matchesInString:myHTML options:0 range:NSMakeRange(0, [myHTML length])];
    for (NSTextCheckingResult *result in matches)
    {
        NSRange resultRange = [result range];
        resultRange.location += offset;

        NSString *match = [regex replacementStringForResult:result inString:myHTML offset:offset template:@"$0"];
        NSString *replacement = [match stringByReplacingOccurrencesOfString:@" " withString:@"%20"];

        myHTML = [myHTML  stringByReplacingCharactersInRange:resultRange withString:replacement];
        offset += ([replacement length] - resultRange.length);
    }
}
于 2015-06-13T11:11:45.770 に答える
0

スペースを使用して文字列を分割して、スペースのない文字列の配列を作成できます。次に、これらの各文字列をデータ検出器にフィードできます。

// assume str = <img src="http://www.blah.com/My First Image Here.jpg">
NSArray *components = [str componentsSeparatedByString:@" "];
for (NSString *strWithNoSpace in components) {
    // feed strings into data detector
}

もう 1 つの方法は、特にその HTML タグを探すことです。ただし、これは一般的ではない解決策です。

// assume that those 3 HTML strings are in a string array called strArray
for (NSString *htmlLine in strArray) {
    if ([[htmlLine substringWithRange:NSMakeRange(0, 8)] isEqualToString:@"<img src"]) {
        // Get the url from the img src tag
        NSString *urlString = [htmlLine substringWithRange:NSMakeRange(10, htmlLine.length - 12)];
    }
}
于 2015-06-09T19:54:44.450 に答える
-1

URL にスペースを含めないでください。次のように、URL 関連の処理を行う前に、文字列からすべてのスペースを削除します。

// Custom function which cleans up strings ready to be used for URLs
func cleanStringForURL(string: NSString) -> NSString {
    var temp = string
    var clean = string.stringByReplacingOccurrencesOfString(" ", withString: "")
    return clean
}
于 2015-06-12T19:49:33.367 に答える
-1

HTML で NSDataDetector を使用しないでください。これは、コンピューターで生成されたデータではなく、通常のテキスト (ユーザーが入力したもの) を解析することを目的としています (実際、コンピューターで生成された、おそらくユーザーに関係のないものを実際に検出しないようにするための多くのヒューリスティックがあります)。

文字列が HTML の場合は、HTML 解析ライブラリを使用する必要があります。これを行うのに役立つオープンソース キットが多数あります。次に、アンカーの href 属性を取得するか、テキスト ノードで NSDataDetector を実行して、文字列をタグで汚染することなく、マークアップされていないものを見つけます。

于 2015-06-10T06:29:54.207 に答える