2010-01-04 122 views
0

我正在寫一個iPhone應用程序,必須從網站上拉原始HTML數據,抓取鏈接的URL和鏈接的顯示文本。使用正則表達式解析<a href src="">Links</a>出NSString

例如在類似<a href="www.google.com">Click here to go to google</a>

它會拉搶 URL = www.google.com 文本=點擊這裏去谷歌

我使用regexlite庫,但我絕不是正則表達式的專家,我嘗試了幾件事情來實現這個功能。

我想用下面的代碼

NSString *searchString = @"$10.23, $1024.42, $3099"; 
NSString *regexString = @"\\$((\\d+)(?:\\.(\\d+)|\\.?))"; 
NSArray *capturesArray = NULL; 

capturesArray = [searchString arrayOfCaptureComponentsMatchedByRegex:regexString]; 

所以我的問題是誰能告訴我什麼是搜索字符串將解析HTML鏈接或指向我一個明確的教程我如何regexlite作品已經厭倦了閱讀在http://regexkit.sourceforge.net/RegexKitLite/的文件,我不明白。

由於提前,

Zen_silence

回答

0

如果任何人有這個同樣的問題,正則表達式字符串匹配的HTML鏈接是

NSString *regexString = @"<a href=([^>]*)>([^>]*) - "; 

的奧賴利書「精通正則表達式」幫我算出這個真的很快,我強烈建議,如果你正在閱讀試圖使用正則表達式。

4

總之,不這樣做。正則表達式是解析HTML的可怕方法。 HTML文檔高度結構化,其標籤層次結構可以跨越行,而不會在呈現的表單中出現所述行。

假設結構良好的HTML,您可以使用XML解析器。

特別是,iPhone提供了NSXMLParser以及其中一些很好的例子。

+0

如果HTML實際上是高度結構化的 - 那麼你自己會說「假設結構良好的HTML」,那將會很棒。在一般情況下,你實際上不能假設這一點,而當你僅僅想要一個鏈接時,試圖將整個HTML解析爲一個DOM是很困難的。 – 2010-01-04 06:40:47

+0

Yah - 但是,如果結構錯誤的HTML,您經常遇到跨多行的錨,否則就會迷惑正則表達式。如果您需要處理破碎的輸入,最好使用某種HTML解析器並處理它所噴出的任何DOM。 – bbum 2010-01-05 03:02:38

+0

我正在使用非常糟糕的HTML我沒有控制結構,所以它更容易,如果我只是抓住一切是一個鏈接,我已經得到我的HTML使用子字符串搜索可管理的大小。我寧願用正則表達式來抓取我需要的情侶。 除非你能指向我一個很好的html解析包裝器,因爲SDK中提供的包裝器不是很好,我以前使用過。我嘗試了hpple庫,但我無法弄清楚如何讓它運行 – 2010-01-05 04:30:07

0

搜索字符串將整個原始的HTML文本,並regexString應該更像:

NSString *regexString = @"href=\"(.*)\">(.*)<"; 

那麼你可以使用捕捉比賽拉出MATCH1和MATCH2,使用範圍,通過HTML文本重複比賽選項搜索,以便您可以跳過您已經搜索過的內容...

我不知道你要用searchString和數字來做什麼。

+0

searchString只是一個示例字符串,我正在試着學習正則表達式。 我認爲用正則表達式我可以做兩個匹配的數組。 – 2010-01-05 03:26:01

+1

你可以 - 如果你有固定的文本你正在尋找,你可以在一個正則表達式中做多個匹配。對於這樣的事情,雖然它可能會更好地做多個匹配,如果可能的話,限制你正在搜索的文本的範圍。 我強烈推薦一本關於RegEx的好書,就像Oreilly的書「掌握正則表達式」一樣。這真的像一個其他的編程語言,而且功能非常強大 – 2010-01-05 04:52:02

+0

優秀的書肯德爾我有一個朋友碰巧有一個副本。他讓我借來它只是很快翻轉,雖然它可以形成這條線: NSString * regexString = @「]?)"; That string gets the URL now i have no idea how to pull out the text inbetwen the tags。 我也有我的代碼傾倒每個比賽組到自己的位置在一個多D陣列 – 2010-01-05 06:03:54

相關問題