iOS - 网址、链接、网页地址、下载链接等正则表达式匹配(解决url包含中文不能编码的问题)
DNS规定,域名中的标号都由英文字母和数字组成,每一个标号不超过63个字符,也不区分大小写字母。标号中除连字符(-)外不能使用其他的标点符号。级别最低的域名写在最左边,而级别最高的域名写在最右边。由多个标号组成的完整域名总共不超过255个字符。
由此匹配完整域名的正则表达式:
^(?=^.{,}$)[a-zA-Z0-][-a-zA-Z0-]{,}(\.[a-zA-Z0-][-a-zA-Z0-]{,})+$
例如:baidu.com
匹配网址:
^(?=^.{,}$)(http(s)?:\/\/)?(www\.)?[a-zA-Z0-][-a-zA-Z0-]{,}(\.[a-zA-Z0-][-a-zA-Z0-]{,})+(:\d+)*(\/\w+\.\w+)*$
例如: http://www.baidu.com
匹配http url:
^(?=^.{,}$)(http(s)?:\/\/)?(www\.)?[a-zA-Z0-][-a-zA-Z0-]{,}(\.[a-zA-Z0-][-a-zA-Z0-]{,})+(:\d+)*(\/\w+\.\w+)*([\?&]\w+=\w*)*$
例如: http://www.tetet.com/index.html?q=1&m=test
项目中WKWebView使用:
WKWebView *_detailWebView;
//识别二维码跳转;不是链接显示内容点击网址跳转
if ([self.m_url hasPrefix:@"http"]) {
// NSString *urlStr = [self.m_url stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
// 解决url包含中文不能编码的问题
NSString *urlStr = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)self.m_url,(CFStringRef)@"!$&'()*+,-./:;=?@_~%#[]",NULL,kCFStringEncodingUTF8));
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:url];
[request setHTTPShouldHandleCookies:YES];
[_detailWebView loadRequest:request];
} else {
self.topTitleLabel.text = @"扫描结果";
QRCodeLabel = [[ZXLabel alloc]initWithFrame:CGRectMake(, , SCREENWIDTH-, ) fontSize: text:@"" textColor:[UIColor colorWithHexString:@"#000000"] textAlignment:NSTextAlignmentLeft numberOfLines:];
[_detailWebView addSubview:QRCodeLabel];
if ([self urlValidation:[NSString stringWithFormat:@"%@",self.m_url]]==YES) {//网址
[self textColour];
QRurlStr = [NSString stringWithFormat:@"http://%@",[NSString stringWithFormat:@"%@",self.m_url]];
} else {
// 文字html可拷贝,查询
QRurlStr = [NSString stringWithFormat:@"<html><head><meta http-equiv='Content-Type' content='text/html; charset=utf-8'><meta name='viewport' content='width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no'><style>*{margin:5px;padding:0px;}</style><title></title></head<body>%@</body></html>",[NSString stringWithFormat:@"%@",self.m_url]];
[_detailWebView loadHTMLString:QRurlStr baseURL:Nil];
}
}
#pragma mark -- 识别图中二维码
/**
* 网址正则验证
*
* @param string 要验证的字符串
*
* @return 返回值类型为BOOL
*/
- (BOOL)urlValidation:(NSString *)string {
NSError *error;
NSString *regulaStr = @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\\.\\-]+\\.([a-zA-Z]{2,4})(:\\d+)?(/[a-zA-Z0-9\\.\\-~!@#$%^&*+?:_/=<>]*)?)|^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regulaStr options:NSRegularExpressionCaseInsensitive error:&error];
NSArray *arrayOfAllMatches = [regex matchesInString:string options: range:NSMakeRange(, [string length])];
for (NSTextCheckingResult *match in arrayOfAllMatches){
NSString* substringForMatch = [string substringWithRange:match.range];
NSLog(@"匹配--%@",substringForMatch);
return YES;
}
return NO;
}
- (void)textColour {
NSMutableAttributedString *abs = [[NSMutableAttributedString alloc]initWithString:[NSString stringWithFormat:@"%@",self.m_url]];
[abs beginEditing];
//字体大小
// [abs addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:20.0] range:NSMakeRange(0, 2)];
//字体颜色
[abs addAttribute:NSForegroundColorAttributeName value:[UIColor blueColor] range:NSMakeRange(,[NSString stringWithFormat:@"%@",self.m_url].length)];
//下划线
[abs addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleSingle) range:NSMakeRange(,[NSString stringWithFormat:@"%@",self.m_url].length)];
QRCodeLabel.attributedText = abs;
UITapGestureRecognizer *LabelTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(capchaBtn:)];
QRCodeLabel.userInteractionEnabled = YES;
[QRCodeLabel addGestureRecognizer:LabelTap];
}
// 链接跳转
- (void)capchaBtn:(UITapGestureRecognizer *)sendr{
NSLog(@"跳转网页~~");
[QRCodeLabel removeFromSuperview];
//NSString *urlStr = [QRurlStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *urlStr = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)QRurlStr,(CFStringRef)@"!$&'()*+,-./:;=?@_~%#[]",NULL,kCFStringEncodingUTF8));
NSURL *url =[NSURL URLWithString:urlStr];
NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:url];
[request setHTTPShouldHandleCookies:YES];
[_detailWebView loadRequest:request];
}
iOS - 网址、链接、网页地址、下载链接等正则表达式匹配(解决url包含中文不能编码的问题)的更多相关文章
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
- Uniapp云打包生成apk下载链接
使用uni[]()app云打包生成安装包下载链接 manifest.json 中配置自动获取appid manifest.json中配置app 图标 按教程生成.keystore证书 使用云打包生成安 ...
- 使用htmlparse爬虫技术爬取电影网页的全部下载链接
昨天,我们利用webcollector爬虫技术爬取了网易云音乐17万多首歌曲,而且还包括付费的在内,如果时间允许的话,可以获取更多的音乐下来,当然,也有小伙伴留言说这样会降低国人的知识产权保护意识,诚 ...
- 使用htmlparser爬虫技术爬取电影网页的全部下载链接
昨天,我们利用webcollector爬虫技术爬取了网易云音乐17万多首歌曲,而且还包括付费的在内,如果时间允许的话,可以获取更多的音乐下来,当然,也有小伙伴留言说这样会降低国人的知识产权保护意识,诚 ...
- iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接)
iOS开发UI篇—推荐两个好用的Xcode插件(提供下载链接) 这里推荐两款好用的Xcode插件,并提供下载链接. 一.插件和使用如下: 1.两款插件 对项目中图片提供自动提示功能的插件:KSImag ...
- paip.点击每个网页链接都提示下载的解决。
paip.点击每个网页链接都提示下载的解决. 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn. ...
- Python 网络爬虫 009 (编程) 通过正则表达式来获取一个网页中的所有的URL链接,并下载这些URL链接的源代码
通过 正则表达式 来获取一个网页中的所有的 URL链接,并下载这些 URL链接 的源代码 使用的系统:Windows 10 64位 Python 语言版本:Python 2.7.10 V 使用的编程 ...
- ios系统App Store安装包下载链接获取
今天将自己开发的Android版本和ios版本的安装包通过生成二维码的方式展示在H5页面上,Android版的比较简单,但是ios的安装包用户必须从App Store(苹果应用市场)中下载安装,所以获 ...
- 怎么找到苹果App Store的应用程序下载链接地址
http://jingyan.baidu.com/article/6dad5075f6fa79a123e36e85.html 怎么找到苹果App Store的应用程序下载链接地址 每个上传到苹果app ...
随机推荐
- python中,获取字符串的长度
说明: 与其他的语言一样,有时候需要查看或者说计算字符串的长度.在此记录下python中通过哪个函数实现. 操作过程: 1.通过len()函数返回字符串的长度 >>> text='p ...
- chrome插件开发之调试
https://blog.csdn.net/qustdong/article/details/46046553
- 教你解锁被锁住的苹果mac电脑的文件跟文件夹,同时也可删除被锁的文件跟文件夹(转)
在Mac OSX 下无法删除的文件可大概分为下列三种情形 1.档案(夹)被锁定 2.文件正在使用中 3.没有权限的档案(夹) 一.「 为什么档案会被锁定 」 1.个人自行替档案加上 2.在拷贝或是整理 ...
- 7 -- Spring的基本用法 -- 7... 创建Bean的3种方式
7.7 创建Bean的3种方式 ① 调用构造器创建Bean. ② 调用静态工厂方法创建Bean. ③ 调用实例工厂方法创建Bean. 7.7.1 使用构造器创建Bean实例. 使用构造器来创建Bean ...
- 解压安装的tomcat, 使用chkconfig命令让tomcat 随机启动,tomcat 变为系统服务
使用解压安装的tomcat包,命令行输入 service tomcat start 会报 tomcat: unrecognized service 错误提示,意思是说系统没有找到该服务. 好了,我们现 ...
- nodejs服务器部署教程三
安装mongodb数据库 如何在ubuntu上安装mongodb数据库,其实官方文档写的很清楚啦 sudo apt-key adv --keyserver hkp://keyserver.ubuntu ...
- numpy, pandas, matplotlib等常用库的学习手册
pandas介绍: 待续 参考资料: 中文:https://www.cnblogs.com/skying555/p/5914391.html 英文:http://www.datadependence. ...
- linux 下查看cpu信息
linux 操作系统的位数查看 A. getconf LONG_BIT 如果是32表示是32位 B. file /sbin/init信息全面一些 root@kali:~/software# file ...
- Java的多线程
Java使用Thread代表线程,所有的线程对象都必须是Thread类或其子类的实例.每个线程的作用就是执行一段程序流(完成一定的任务). Java使用线程执行体来代表这段程序流. 1. 继承Thre ...
- Java实现简单的正则表达式匹配
import java.util.regex.Pattern; public class Test_REG { public static void main(String[] args) { //只 ...