天天看点

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

继续阅读