基于RegExRX的最简单的网页源代码取正则式

一般在自己做程序的时候,没有后台给的接口,有的时候会涉及到从网页的源代码入手,而用到网页源代码,就少不了正则表达式的应用,正则表达式更多详细用法请见下链接,这里只介绍其中的一种
详细的正则表达式语法请见网站

<img alt="(.*?)" src="(.*?)" /></a><span><a target="_blank"(.*?)href="(.*?)" class="yellow"(.*?)>(.*?)</a></span></p><dl><dt><a title="(.*?)" href="(.*?)"(.*?) target="_blank">(.*?)</a></dt><dd><p><em>更新于:</em><span><font color="#ff0000">(.*?)</font></span></p><p><em>状&#12288;态:</em><span class="(.*?)">(.*?)</span></p><p>

上述代码就是一个网页的正则表达式,其中(.*?)就代表你要替换的内容,就是在网页中,把你需要的内容(图片、网页等)信息用(.*?)替换,然后在代码中,通过(.*?) 的位置来取出,这与数组不同的是,数组是从0开始,在正则式中,0表示不存在,取第几个就是几。
代码如下:
首先,进行网页转码:

unsigned long encode = 0;
        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:0 error:&err];
                                NSArray *resultMatches = [resultRegex matchesInString:responseString options:0 range:NSMakeRange(0, [responseString length])];//responseString为处理后的网页源代码
                                for (NSTextCheckingResult *oneResult in resultMatches)
                                {//在forin循环里写对得到数据的处理
                                    NSString *name = [responseString substringWithRange:[oneResult rangeAtIndex:regexNum]];//regexNum为需要的第几个正则式
                                }

第二种情况,直接得到网页的一条数据

if ([responStr length] > 0)//responStr为网页源代码,comicRegular为正则表达式,comicIndex为第几个正则式
            {

                NSRegularExpression *resultRegex =[NSRegularExpression regularExpressionWithPattern:comicRegular options:0 error:&err];
                NSTextCheckingResult *match = [resultRegex firstMatchInString:responStr options:0 range:NSMakeRange(0, [responStr length])];

                if ((match.range.length != 0) && ([[comicRegular componentsSeparatedByString:@"(.*?)"] count] > comicIndex)) {
                    resultStr = [[responStr substringWithRange:[match rangeAtIndex:comicIndex]] stringByConvertingHTMLToPlainText];//resultStr为返回我们所需要的数据
                }else{
                    return nil;
                }
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值