鱼喃

听!布鲁布鲁,大鱼又在那叨叨了

正则表达式(4)---PHP中的使用

PHP中的正则引擎有pregeregmb_ereg三种。一般情况下,preg的速度和功能方面要强于其他两个,本文只讲preg(Perl Regulai Expressions),preg使用的是NFA引擎。

提取/提取邮箱

构造正则表达式如下

w+@w+(?:w+)+

注1:尽管 [email protected] 这也是一种有效的邮箱格式但是为了表达式简单,我不打算去支持它。
注2:关于正则表达式中的元字符,请参考正则表达式(1)—初识正则与元字符

PHP的实现代码

1
2
3
4
5
$regex='/\w+@\w+(?:\.\w+)+/i';
if(preg_match($regex, $text, $matches))
{
var_dump($matches);
}

注1:preg_match() 函数第一个参数是正则表达式,第二个是需要解析的文本,第三个是存储捕获的文本存储变量,第三个变量可以省略。返回值是boolean类型。表示是否存在匹配。
注2:前后的“/”表示分隔符,必须有,详细见后。
注3:preg_match()函数只能匹配并捕获到一组符合条件的字符串,如果提取出所有匹配的,需要用到preg_match_all(),函数,参数与preg_match()相似,返回值是int,表示匹配的个数。
注4:最后的i表示不区分大小写
注5:php中尽量使用单引号表示字符串不然会出现很多奇怪的错误,见php中的单引号与双引号

替换邮箱

负责人的邮箱换了,要更新网站上的联系邮箱。由于网站编写时是纯静态页面,一张一张页面改着实麻烦,这时候就需要用到正则表达式的替换功能。

还是那个正则表达式,更改后的邮箱地址是[email protected]

PHP实现代码

preg_replace($regex, ‘input@newnius.com‘,$text);

注1:$regex是正则表达式,中间是替换的文本,$text 是待处理的文本
注2:返回值是替换后的字符串

有时候,我们提取出来邮箱地址并不是更改成同一个,而是要经过很多步的处理,这时候正则表达式就有点力不从心了。PHP中的正则表达式还提供了另一个函数,专门用以解决这种问题。

1
2
3
4
5
function handle_email($email)
{
return '[email protected]';
}
var_dump(preg_replace_callback($regex,'handle_email',$text));

注1:preg_replace_callback() 表示将提取到的匹配项传递给 自定义函数处理,后者则返回替换后的文本。

注2:’handle_email’ 是自定义函数的名称,以字符串类型传递,有且仅有一个参数,并且有返回。

其他应用,解析字符串形式的数组

例如,将“newnius,jlu,csw”解析为数组(元素以“,”分隔),方便进一步处理。

尽管用explode() 也能完成任务,但是如果面对复杂一点,不固定的分隔符,explode()就有点无能为力了。

1
var_dump(preg_split($regex, $text));

注1:preg_spilt() 与explode()类似,但是在应对不固定的分隔符方面更加灵活
注2:返回值是分割之后的数组,如果分隔符之间没有内容,也会有返回。

关于PHP正则表达式中的分隔符

Preg引擎要求正则表达式两端必须有分隔符,因为设计者希望它看起来更像perl,尤其在模式修饰符的使用方法上更是如此。有的程序员觉得在正则表达式两端添加分隔符简直是多此一举,但是无论好还是不好,规定就是规定。

常见的做法是使用斜线作为分隔符,不过我们还可以用除了字母、数字、反斜线和空白字符之外的任何ascll字符作为分隔符。最常见的是一对斜线,但两个“!”和“#”也很常见。我们可以选择使得语句不那么难以阅读的分隔符。

更多关于preg引擎的内容可以参考PHP官方文档