1.前言
最近公司需要做URL防篡改,需要匹配二级域名做校验,所以有了这篇文章.
最快的上手教程就是从例子中说明问题.
先扫盲一下
[a-z]
匹配所有的小写字母
[A-Z]
匹配所有的大写字母
[a-zA-Z]
匹配所有的字母
[0-9]
匹配所有的数字
[0-9\.\-]
匹配所有的数字,句号和减号,斜划线代表转义
举例:
如果你想匹配一个 ' \ ',你的表达式就是 '\\',
如果你想匹配 ' . ',你的表达式 就是 ' \. ',
[ \f\r\t\n]
匹配所有的空白字符
[^abc] 匹配 非a ,b, c 的字符串,
^abc 匹配以abc开头的字符串
(" ^ "在中括号里面代表不匹配这些字符,在中括号外面代表必须以这个开头,
[^a-z] 除了小写字母以外的所有字符)
句点 (.) 匹配换行符 (\n)之外的所有字符
大括号 '{ }'是指大括号之前的这个元素出现的次数
举例:
an{1,3} 可以匹配的内容是an, ann, annn;
就是限定 n 这个单词出现的次数 只能是 在 1 ~ 3 个之间,
跟上面的 ?, +, * 是一样的效果,这些限定某个元素出现个数的表达式 称为--- 限定符
? 与 {0,1} 是相等的
+ 与 {1,} 是相等的
* 与 {0,} 是相等的
中括号 [ ]里面一般放表达式的内容,
举例:
匹配 abc,则 [abc]
匹配非 a 开头的单词, 则[^a],
匹配以a 开头,第二个非 b的单词,则^a[^b],
定位符^ , $, \B, \b
^ 匹配字符串的开始位置
$ 匹配字符串的结尾位置
\B 非单词边界匹配
\b 匹配一个单词边界,即字与空格间的位置
以后里面会添加更多的例子,慢慢补充...
1>一个练习正则的网站 正则练习-校验,里面会告诉你哪个正则匹配哪个字段,书写错误的地方,能匹配多少种可能,很屌很强大,是全英文的.

2>小白入门的正则网站 正则表达式30分钟入门教程-作者:deerchao

3>正则详细的文字教程 runoob

2.实例篇
实际开发中为了拦截不合法的网址,采取正则匹配的方式,
例如:http://exam.com.yy.com.127.0.0.1.xip.io:8000/2.png
需求希望不论传入怎样的网址,我后端配了白名单之后,不合法的网址全部拦截,比如后端配置yy.com
的二级域名,不包含二级域名的全部拦截掉;你可能会说 ,直接 用字符串containsString
不就行了吗,https://www.baidu.com.cn/abc/cba.yy.com.png
,这种情况显然不行,因为yy.com
不包含在主域名里面,后面路径随意加上个yy.com
就可以混过去,所以我们需要截取主域名.
安卓的同学 找到了对应的官方API来获取主域名,我尝试在Xcode中敲host
,还真让我找到了,这是代码
- (void)testURLWithURL:(NSString *)url{
if (url.length == 0) {
return;
}
// url = @"https://image.yy.com.example.com/22.png";
CFURLRef urlRef = CFURLCreateWithString(NULL, (CFStringRef)url, NULL);
CFStringRef cURLString = CFURLCopyHostName(urlRef);
NSString *hostStr = (__bridge NSString *)cURLString;
NSLog(@"%@", hostStr);
NSArray *URLs = @[@"yy.com"];
}
比如url是http://exam.image.yy.com.127.0.0.1.xip.io:8000/2.png
,打印出来的host就是exam.image.yy.com.127.0.0.1.xip.io
,这样截取出来的再用containsString
,就行了,实际开发中,可能还会有这种情况,url是这样的http://exam.imageyy.com
,所以还不能直接判定,这种虽然包含yy.com,但仍然不是一个合法的域名,所以只能匹配.yy.com
这个字符串.
你这篇文章不是说的正则吗,怎么扯上这个???
一开始是以正则来解决这个问题的,后来发现,现在掌握的正则知识,不足以匹配上面出现的情况,还要多练习.
网友评论