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

4

我刚刚收到 Apple 的回复,原因是我对此提交了一个错误:

我们相信这个问题已经在最新的 iOS 9 测试版中得到解决。这是一个预发布的 iOS 9 更新。

有关完整的安装说明,请参阅发行说明。

请使用此版本进行测试。如果您仍有问题,请提供任何有助于我们调查的相关日志或信息。

iOS 9 https://developer.apple.com/ios/download/

我将测试并让大家知道这是否已在 iOS 9 中修复。

于 2015-06-15T23:26:08.670 回答
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
}

另一种选择是专门查找该 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 回答
0

我找到了一种非常老套的方法来解决我的问题。如果有人提出了可以应用于所有 URL 的更好的解决方案,请这样做。

因为我只关心以.jpg那个结尾的 URL 有这个问题,所以我能够想出一个狭窄的方法来追踪这个问题。

本质上,我将字符串分解为基于它们的组件,从"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

您可以NSRegularExpression通过使用简单的正则表达式来检测链接,然后只对空格进行编码来修复所有 URL(如果您需要更复杂的编码,您可以查看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

试试这个正则表达式模式: @"<img[^>]+src=(\"|')([^\"']+)(\"|')[^>]*>" 忽略大小写...匹配 index=2 的源 url。

javascript中的正则表达式演示:(尝试寻求帮助)

演示

于 2015-06-17T19:42:36.173 回答
0

Give this snippet a try (I got the regexp from your first commentator user3584460) :

NSError *error = NULL;
NSString *myHTML = @"<http><h1>My main item</h1><img src=\"http://www.blah.com/My First Image Here.jpg\"><h2>Some extra data</h2><img src=\"http://www.bloh.com/My Second Image Here.jpg\"><h3>Some extra data</h3><img src=\"http://www.bluh.com/My Third-Image Here.jpg\"></http>";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"src=[\"'](.+?)[\"'].*?>" options:NSRegularExpressionCaseInsensitive error:&error];

NSArray *arrayOfAllMatches = [regex matchesInString:myHTML options:0 range:NSMakeRange(0, [myHTML length])];

NSTextCheckingResult *match = [regex firstMatchInString:myHTML options:0 range:NSMakeRange(0, myHTML.length)];



for (NSTextCheckingResult *match in arrayOfAllMatches) {
    NSRange  range = [match rangeAtIndex:1];

    NSString* substringForMatch = [myHTML substringWithRange:range];
    NSLog(@"Extracted URL : %@",substringForMatch);

}

In my log, I have :

Extracted URL  : http://www.blah.com/My First Image Here.jpg
Extracted URL  : http://www.bloh.com/My Second Image Here.jpg
Extracted URL  : http://www.bluh.com/My Third-Image Here.jpg
于 2015-06-19T20:26:26.537 回答
-1

您不应该将 NSDataDetector 与 HTML 一起使用。它旨在解析普通文本(由用户输入),而不是计算机生成的数据(事实上,它有许多启发式方法来实际确保它不会检测到可能与用户无关的计算机生成的东西)。

如果您的字符串是 HTML,那么您应该使用 HTML 解析库。有许多开源工具包可以帮助您做到这一点。然后只需获取锚点的 href 属性,或在文本节点上运行 NSDataDetector 以查找未标记的内容,而不会用标签污染字符串。

于 2015-06-10T06:29:54.207 回答
-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 回答