一般在自己做程序的时候,没有后台给的接口,有的时候会涉及到从网页的源代码入手,而用到网页源代码,就少不了正则表达式的应用,正则表达式更多详细用法请见下链接,这里只介绍其中的一种
详细的正则表达式语法请见网站
上述代码就是一个网页的正则表达式,其中
(.*?)
就代表你要替换的内容,就是在网页中,把你需要的内容(图片、网页等)信息用
(.*?)
替换,然后在代码中,通过
(.*?)
的位置来取出,这与数组不同的是,数组是从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;
}
}