一般在自己做程式的時候,沒有背景給的接口,有的時候會涉及到從網頁的源代碼入手,而用到網頁源代碼,就少不了正規表達式的應用,正規表達式更多詳細用法請見下連結,這裡隻介紹其中的一種
詳細的正規表達式文法請見網站
上述代碼就是一個網頁的正規表達式,其中
(.*?)
就代表你要替換的内容,就是在網頁中,把你需要的内容(圖檔、網頁等)資訊用
(.*?)
替換,然後在代碼中,通過
(.*?)
的位置來取出,這與數組不同的是,數組是從0開始,在正則式中,0表示不存在,取第幾個就是幾。
代碼如下:
首先,進行網頁轉碼:
unsigned long encode = ;
NSString *responseString;
encode = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF8);
responseString = [[NSString alloc]initWithData:responseObject encoding:encode];
if (!responseString)
{
encode = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);
responseString = [[NSString alloc]initWithData:responseObject encoding:encode];
}
一般網頁什麼格式的,在網頁源代碼中開頭的位置就有顯示

然後為了友善寫正規表達式,将得到的網頁源代碼按照字元串的方式截取、替換,這裡的截取是将網頁中不重要的部分去除掉
if (beginString)//需要截取的開頭字元串,responseString為轉碼後的網頁源代碼
{
NSRange range = [responseString rangeOfString:beginString];
if (range.location != NSNotFound)
{
responseString = [responseString substringFromIndex:range.location + range.length];
}else{
BookLogDebug(@"沒有找到 beginString :%@", beginString);
}
}
if (endString)//需要截取的結尾字元串
{
NSRange range = [responseString rangeOfString:endString];
if (range.location != NSNotFound)
{
responseString = [responseString substringToIndex:range.location];
}else{
BookLogDebug(@"沒有找到 endString :%@", endString);
}
}
return responseString;
替換,将多餘的空格、換行的空白的地方去掉
for (NSString *subStr in repleaseArr) {//repleaseArr是寫有需要替換的數組,resultStr為截取後的網頁源代碼
if ([subStr isEqualToString:@"換行"]) {
resultStr = [resultStr stringByReplacingOccurrencesOfString:@"\n" withString:@"###"];
}else if ([subStr isEqualToString:@"回車"]) {
resultStr = [resultStr stringByReplacingOccurrencesOfString:@"\r" withString:@"@@@"];
}else{
resultStr = [resultStr stringByReplacingOccurrencesOfString:subStr withString:@""];
}
}
return resultStr;
最後進行資訊的擷取,在這裡分為兩種方式,一種是通過正則式在網頁中擷取到很多的資料,像數組的形式
這時所用到的方法
NSError *err = nil;
NSRegularExpression *resultRegex = [NSRegularExpression regularExpressionWithPattern:@"這裡面寫正規表達式,這裡面如果雙引号沖突,在前面加轉移符'\'" options: error:&err];
NSArray *resultMatches = [resultRegex matchesInString:responseString options: range:NSMakeRange(, [responseString length])];//responseString為處理後的網頁源代碼
for (NSTextCheckingResult *oneResult in resultMatches)
{//在forin循環裡寫對得到資料的處理
NSString *name = [responseString substringWithRange:[oneResult rangeAtIndex:regexNum]];//regexNum為需要的第幾個正則式
}
第二種情況,直接得到網頁的一條資料
if ([responStr length] > )//responStr為網頁源代碼,comicRegular為正規表達式,comicIndex為第幾個正則式
{
NSRegularExpression *resultRegex =[NSRegularExpression regularExpressionWithPattern:comicRegular options: error:&err];
NSTextCheckingResult *match = [resultRegex firstMatchInString:responStr options: range:NSMakeRange(, [responStr length])];
if ((match.range.length != ) && ([[comicRegular componentsSeparatedByString:@"(.*?)"] count] > comicIndex)) {
resultStr = [[responStr substringWithRange:[match rangeAtIndex:comicIndex]] stringByConvertingHTMLToPlainText];//resultStr為傳回我們所需要的資料
}else{
return nil;
}
}