2

我有一个NSString来自一个 37014 个字符长的 HTML 页面,其中散布着大约 20 个 URL。我使用此代码查找 URL 并将它们放在NSArray

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?:([^:/?#]+):)?(?://([^/?#]*))?([^?#]*\\.(?:jpg|gif|png))(?:\\?([^#]*))?(?:#(.*))?"
                                                                       options:NSRegularExpressionCaseInsensitive
                                                                         error:&error];
NSArray *matches = [regex matchesInString:final
                                  options:0
                                    range:NSMakeRange(0, [final length])];

问题在于,即使在 iPhone 4S 上,代码也需要 5 秒才能执行。一页太慢了……我需要浏览 20 个 HTML 页面!

有更快的方法吗?也许NSScannerNSRange?有人有什么创意吗?

4

3 回答 3

8

用.查看NSDataDetectorNSTextCheckingTypeLink

于 2012-04-16T22:09:35.537 回答
2

你的正则表达式有点极端。对于您可能确定不匹配的东西,它不会很快失败。从粗略的角度来看,您似乎正在对整个字符串进行几乎 N^2 次搜索。您应该尽可能早地消除匹配项。

您真的希望您的 URL 以非单词边界开始吗?

您的正则表达式试图过于笼统。分析您的数据,看看您是否真的希望解析格式如此自由的 URL。最后,你最好使用几个早期失败的正则表达式,而不是一个复杂到几乎匹配所有内容的正则表达式。

此外,请确保您在下载数据的后台线程中执行此操作。与下载相比,您的搜索应该不会花很长时间 - 虽然搜索 37k 字节需要 5 秒......我几乎可以用我的眼睛做到这一点。

于 2012-04-16T22:25:25.157 回答
0

AutoHyperlinks (https://bitbucket.org/sholt/autohyperlinks2/overview) 是一个非常出色的库。

于 2012-04-17T00:37:58.567 回答