天天看點

基于RegExRX的最簡單的網頁源代碼取正則式

一般在自己做程式的時候,沒有背景給的接口,有的時候會涉及到從網頁的源代碼入手,而用到網頁源代碼,就少不了正規表達式的應用,正規表達式更多詳細用法請見下連結,這裡隻介紹其中的一種

詳細的正規表達式文法請見網站

上述代碼就是一個網頁的正規表達式,其中

(.*?)

就代表你要替換的内容,就是在網頁中,把你需要的内容(圖檔、網頁等)資訊用

(.*?)

替換,然後在代碼中,通過

(.*?)

的位置來取出,這與數組不同的是,數組是從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];
        }
           

一般網頁什麼格式的,在網頁源代碼中開頭的位置就有顯示

基于RegExRX的最簡單的網頁源代碼取正則式

然後為了友善寫正規表達式,将得到的網頁源代碼按照字元串的方式截取、替換,這裡的截取是将網頁中不重要的部分去除掉

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;
           

最後進行資訊的擷取,在這裡分為兩種方式,一種是通過正則式在網頁中擷取到很多的資料,像數組的形式

基于RegExRX的最簡單的網頁源代碼取正則式

這時所用到的方法

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;
                }
            }
           

繼續閱讀