涂雅[博客园]
最新文章请访问独立博客:http://iove.net

很多程序员以为,正则表达式只能做一些校验工作,比如说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/

posted on 2010-01-04 10:26  Conis  阅读(344)  评论(0)    收藏  举报