很多程序员以为,正则表达式只能做一些校验工作,比如说E-mail的校验,比如说电话号码的校验,而实际上,正则表达式可以做得更多。在我们的开发过程中,常常会有一些文本需要处理,比如说替换,比如说查找匹配。甚至于在我们的日常工作中也会有同样的需求,比如说在Word中,我们需要把重复的单词替换掉。今天我想说说在日常开发中,哪些地方会用到正则表达式,这些表达式都是从我开发的代码中提取出来的,不局限于哪一种流派和语言,可能是Javascript、Java、PHP、C#,甚至Sql Server。但我并不打算来讲正则表达式的入门,如果你完全不懂正则表达式,请移步其它相关网站,因为你需要有一些正则表达式才能看懂接下来的内容。
应用示例一
示例语言:Javascript
场景:在JS中,我们做数据运算,需要保留结果的任意N位小数,比如说3.1415926...,我们需要保留为3.141
应对:对于这样的需求,我们无法使用Mach的数学函数来处理,那么,我们可以将float数转换为字符串,再用正则表达式进行替换,得出想要的结果。
示例代码:
var number = "3.1415926"; var number = "3.1415926"; document.writeln(number.toString().replace(/(\d+\.\d{0,3})\d+/, "$1"));
通过上面一个简单的正则表达式,我们就截取了一个小数点后面三位数字的结果出来了。
应用示例二
示例语言:Javascript
场景:我们知道,在Javascript中,是没有format的函数的,Java中也没有format字符串的函数(好像只有在print才可以使用),如果你常常使用C#,那么,你一定会怀念使用这样的语法:"欢迎访问{0}".Format("http://iove.net");,来看看正则表达式可以做什么吧(这个函数写得很巧妙,我也是从网上找到的):
示例代码:
String.prototype.format = function() { var arg = arguments; return this.replace(/\{(\d+)\}/g, function(i, m) { return arg[m]; }); }
应用示例三
示例语言:PHP
场景:我以前的Blog是z-blog,后来换成了wordpress,这样造成了url不一致,如果用户通过以前的收藏或者搜索引擎过来的话,可能找不到需要的文章,怎么办呢?我们需要做一个URL重定向,也就是301。
示例代码(部分):
function redirectConis() { $url = $_SERVER['REQUEST_URI']; //对于图片和js等内容,不需要做做匹配处理 if (strpos($url,'.gif') != false || strpos($url,'.png') != false || strpos($url,'.jpg') != false || strpos($url,'.js') != false || strpos($url,'.css') != false) return; //匹配原来文章的url if(preg_match('/\/post\/(\d+)\.html/is', $url, $arr)) { //新旧id对应 $newIds = array(1=>'685',2=>'686',3=>'687'); //可以通过 //找到新的id,如果没有新的id,则可以直接访问主页 $url = 'http://iove.net/'.$newIds[$arr[1]]; } //匹配包括tag的地址 elseif(preg_match('/\/catalog\.asp\?tags=(.+)/is', $url, $arr)) { $url = 'http://iove.net/?tag='.$arr[1]; } //匹配日期 elseif(preg_match('/\/catalog\.asp\?date=(\d+)-*(\d)*-*(\d)*/is', $url, $arr)) { $url = 'http://iove.net/date/'.$arr[1]; //如果包括月,则添加月份 if(!empty($arr[2])) { $url = $url.'/'.$arr[2]; } //如果包括天,则添加天 if(!empty($arr[3])) { $url = $url.'/'.$arr[3]; } } else { //如果都没有找到,就转向随机页 $url = 'http://iove.net/index.php'; } $url = 'Location:'.$url; header('HTTP/1.1 301 Moved Permanently'); header($url); }
应用示例四
示例语言:PHP
场景:在做wp-markKeyword这个插件的时候,我需要获取上一页用户搜索的关键字,这个时候,可以使用正则表达式来提取这个关键字,有兴趣的朋友,可以下载wp-markKeyword这个插件查看代码,这个插件的代码是完全开放的,可以任意浏览。
示例代码(关键部分):
function mmkInit() { global $mmkKeyword; $mmkReferer = $_SERVER['HTTP_REFERER']; //get referfer url $url = $_SERVER['REQUEST_URI']; if(preg_match("/\?s=.+/", $url)) //是否为站内搜索 { $mmkReferer = $url; } if(!isset($mmkReferer)) return; if(strpos($mmkReferer, 'baidu.com') != false) //上一页来自百度 { $mmkReferer = urldecode($mmkReferer); $mmkReferer = iconv('gb2312', 'utf-8', $mmkReferer); if(preg_match("/(word|wd)=(.+)&*/im", $mmkReferer, $arr)) { $mmkKeyword = $arr[2]; } } else //来自其它搜索引擎 { $mmkReferer = urldecode($mmkReferer); if(preg_match("/[&\?]([qps]|query)=(.+?)&/im", $mmkReferer, $arr)) { $mmkKeyword = $arr[2]; } if(!isset($mmkKeyword)) { if(preg_match("/[&\?]([qps]|query)=(.+)/im", $mmkReferer, $arr)) { $mmkKeyword = $arr[2]; } } } }
应用示例五
示例语言:C#
场景:我曾经开发一个获取Yahoo及MSN天气的小工具,大家知道,虽然Yahoo和MSN天气有RSS输出,但你需要知道城市对应的代码才可以,如何才能获取所有城市对应的代码呢?我们可以直接分析并抓取Yahoo及MSN的网页,并提取出来它们的城市代码。
示例代码(部分):
//Yahoo部分: //Yahoo部分: @"<a href=""(?<url>.+?/regional.html)"">(?<text>.+?)</a>?"; //获取Yahoo的区域部分正则 @"(?s)<div id=['""]yw-regionalloc['""]>(?<text>.+?)</div>"; //获取省级(按字母分布)的正则 @"<a href=['""](?<url>.+?/regional.html)['""]>(?<text>.+?)</a>"; //读取省级 @"<a href='(?<url>.+?_[a-z]/regional.html)'>(?<text>.+?)</a>"; //读取城市(按字母分页)的正则 @"<a href=""(?<url>.+?/forecast.html)"">(?<text>.+?)</a>"; //读取城市及对应的代码的正则 MSN部分: //读取区域及国家部分 @"<a href=""(?<url>sitemap.aspx\?wealocations=.+?)"">(?<text>.+?)</a>"; //读取省所在的div,然后再从这个div中提取省 @"<div id=""map2"".+?>(?<text>.+?)local.aspx\?"; //提取省 @"<a href=""(?<url>sitemap.aspx\?wealocations=.+?)"">(?<text>.+?) //提取城市及对应的代码 @"<a href=""(?<url>local.aspx\?wealocations=wc:.+?)"">(?<text>.+?)</a>";
注意:本文为我的独立博客镜像博客,自发表不再更新,原文可能随时被更新,敬请访问原文。同时,请大家不要在此评论,如果有什么看法,请点击这里:http://iove.net/1705/
本文来自http://iove.net,欢迎转载,转载敬请保留相关链接,否则视为侵权,原文链接:http://iove.net/1705/
浙公网安备 33010602011771号