正则表达式高级技巧及实例详解(5)
7. 回调(Callbacks)
匹配结果中的特定内容有时可能会需要某种特别的修改。要应用多重而复杂的修改,正则表达式的回调就有了用武之地。回调是用于函数preg_replace_callback
中的动态修改字串的方式。你可以为preg_replace_callback
指定某个函数为参数,此函数能接收匹配结果数组为参数,并将数组修改后返回,作为替换的结果。
例如,我们想将某字串中的字母全部转变成大写。十分不巧,PHP没有直接转化字母大小写的正则操作符。要完成这项任务,就可以用到正则回调。首先,表达式要匹配出所有需要被大写的字母:
/\b\w/
上式同时使用了字词边界和字符类。光有这个式子还不够,我们还需要一个回调函数:
function
upper_case(
$matches
) {
return
strtoupper
(
$matches
[0] );
}
函数upper_case
接收匹配结果数组,并将整个匹配结果转化成大写。 在此例中,$matches[0]
代表需要被大写化的字母。然后,我们再利用preg_replace_callback
实现回调:
preg_replace_callback(
'/\b\w/'
,
"upper_case"
,
$str
);
一个简单的回调即有这般强大的力量。
8. 注释(Commenting)
注释不用来匹配字串,但确实是正则表达式中最重要的部分。当正则越写越深入,越写越复杂,要推译出究竟什么东西被匹配就会变得越来越困难。在正则表达式中间加上注释,是最小化将来的迷糊和困惑的最佳方式。
要在正则表达式内部加上注释,使用(?#comment)
格式。把“comment”替换成你的注释语句:
/(?#数字)\d/
如果你打算把代码公之于众,为正则表达式加上注释就显得尤为重要。这样别人才能更容易看懂和修改你的代码。和其他场合的注释一样,这样做也能为你重访自己以前写的程序时提供方便。
考虑使用“x”或“(?x)”修改器来格式化注释。这个修改器让正则引擎忽略表达式参数之间的空格。“有用的”空格仍然能够通过[ ]
或\s
,或者\
(反义符加空格)来匹配。
/
\d #digit
[ ] #space
\w+ #word
/x
上面的代码与下面的式子作用一样:
/\d(?#digit)[ ](?#space)\w+(?#word)/
请时刻注意代码的可读性。