2

私は、NSString37014文字の長さで約20のURLが散在しているHTMLページからのを持っています。このコードを使用して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])];

問題は、iPhone4Sでもコードの実行に5秒かかることです。1ページには遅すぎます...そして20のHTMLページを通過する必要があります!

より速い方法はありますか?おそらくNSScannerまたはNSRange?誰か創造的なアイデアがありますか?

4

3 に答える 3

8

NSDataDetectorを調べNSTextCheckingTypeLinkます。

于 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 に答える