2012-03-12 62 views
0

基本上我正在尋找一個使用NSRegularExpression匹配HTML(也是新行和空白)的好例子。匹配HTML和NSRegularExpression

我有這樣的PHP代碼,我寫了一段時間後:

preg_match_all("/<dt>(.+?)<\/dt>\W+<dd>(.+?)<\/dd>/si",  $data, $m['deets']); 

現在我知道這部作品在PHP,但對我的生活我不能把它翻譯成Objective-C的。這是我的嘗試。

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<dt>(.+?)<\/dt>\W+<dd>(.+?)<\/dd>" options:(NSRegularExpressionCaseInsensitive) error:&error]; 
return [regex matchesInString:target options:NSCaseInsensitiveSearch range:NSMakeRange(0, [target length])]; 

我在這種情況下的目標是一堆HTML。

+1

我討厭被「那傢伙」,但有一個很流行的觀點就是圍繞着這些部件與正則表達式處理HTML是一個糟糕的主意......它可能是一個主意尋找一個專用的SGML/HTML解析器。 – 2012-03-12 09:50:17

+0

你用簡單的正則表達式試過了你的代碼嗎? – Martin 2012-03-12 10:27:55

+0

我很欣賞這種情緒,但不幸的是我所刮的網站沒有使用特別好的HTML(加載DOM很粗糙)。 – krut 2012-03-12 11:06:54

回答

1

我從來沒有使用過NSRegularExpression,但NSPredicate來代替:

NSError *error = NULL; 
NSString* pattern = @"/<dt>(.+?)<\/dt>\W+<dd>(.+?)<\/dd>/si"; 

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern]; 
if ([predicate evaluateWithObject:myTargetString] == YES) { 
    // Okay 
} else { 
    // Not found 
} 

希望這有助於。

編輯:

NSPredicate是冷靜,不工作,如果你想獲得你的目標串的匹配範圍。

你的代碼是正確的,但問題來自正則表達式,你必須逃避你的\字符,而不是逃避/的。

@"<dt>(.+?)</dt>\\W+<dd>(.+?)</dd>" 

所以:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"<dt>(.+?)</dt>\\W+<dd>(.+?)</dd>" options:(NSRegularExpressionCaseInsensitive) error:&error]; 
return [regex matchesInString:target options:NSCaseInsensitiveSearch range:NSMakeRange(0, [target length])]; 
+0

這會不會踢回相匹配?如果是這樣,我怎麼得到它們?這就是我要找的。 :) – krut 2012-03-12 10:08:41

+1

嗯......我不這麼認爲。是的,這就是你使用NSRegularExpression的原因!看完文檔後,您的代碼似乎很好。我認爲問題出現在正則表達式本身的周圍,並且轉義字符「\」。 – Martin 2012-03-12 10:27:15

+0

你說得很對,馬丁。這工作: @ 「

\\ W +
(+?)(+?)」 – krut 2012-03-12 11:09:19