正则表达式实战(PHP版)
访问:12热度:*****
正则表达式非常强大,但也很难学。花点功夫是值得的。用Netbeans IDE Early Access for PHP虽然因为原来用它做过JAVA的缘故很容易上手,但调试不易让me这个新手学习进度很慢,因为要不停的试错试错再试错,效率很低。昨天装了Zend Studio后感觉太爽了,调试很好用。那就开始吧,解开me一直的心结——正则表达式。
正则表达式是一种可以用于模式匹配和替换的强有力的工具,英文叫Regular Expression,在POSIX中扩充为Extended Regular Expression,简称ereg。ereg共有三种形式:
ereg。默认被php支持,是基础库的一部分,但是对一些新的正则表达式特性不支持,比如lazy模式等。不要被这个Extended迷惑了,要知道POSIX可是1986年制定的。
mb_ereg。是ereg的变体,支持多字节字符(比如中韩日字体编码)。另外一种对多字节的支持方式是preg,需要带上/u修正符(php的4.20版本后有效)。
preg。这个p指的是perl,也就是兼容perl语法的正则表达式。要支持preg需要编译PCRE库,或者直接在服务器端安装。
以上三种形式ereg是兼容性最强的,因为是从基础函数库层面支持的;但preg功能更丰富,速度也快;mb_ereg则对多字节字符支持的很好。比如“中国”的编码是“D6D0B9FA”,用ereg(’/./’,$str)返回D6,如果设定字符编码后用mb_eregx_encoding(”CP936″)就可以返回正确的结果“中”。如果php脚本用的utf-8编码,则可以通过/u修正符来匹配多字节字符。
弄清楚了来龙去脉,下面实战。
一、\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b 用来匹配电子邮件地址,比如xxx@gmail.com;
二、preg_match(string $pattern , string $subject [, array &$matches [, int $flags [, int $offset ]]])返回整数,0则说明未匹配成功,1则说明匹配成功,并会把匹配结果存入$matches中,其中matches[0]存储全匹配结果,mataches[1]则存储子模板匹配结果,其中子模板指的是模板中用括号括起来的部分。示例如下:
preg_match(’@^(?:http://)?([^/]+)@i’,”http://www.php.net/index.html”, $matches);
print_r($matches);
输出:Array ( [0] => http://www.php.net [1] => www.php.net )
正则表达式详解:@^(?:http://)?([^/]+)@i:@是模板限定符,这个可以是其他的比如\/等,因为此模板中有//需要匹配,所以要用不同于/的@,当然其他也行;i是修正符,指的是忽略大小写;^,指必须位于行首;(?:http://),是子模板,其中的?代表此子子模板的匹配项不存入matches,仅仅匹配就行了,没有这个?,则Array[1]应该是http://;第二个?指的前面的模板出现0次或1次;([^/]+)又是一个子模板,匹配/,+则代表需要出现一次或多次。
再来一次:
preg_match(’@^(http://)?([^/]+)@i’,”http://www.php.net/index.html”, $matches);
print_r($matches);
输出:Array ( [0] => http://www.php.net [1] => http:// [2] => www.php.net )
我们再举个其他例子:32选7第2006095期 04091316242830+25 ,提取其中的中奖号码包括特别号。
preg_match(”@((0[1-9]|[1-9][0-9]){7})(?:[+])(0[1-9]|[1-9][0-9])@”,$str,$matches);
print_r($matches);
输出:Array ( [0] => 04091316242830+25 [1] => [...]
No Comments »
Filed under: 软件开发
