“\b”是正则表达式的一个元字符(Metacharacter),代表着单词的开头或结尾,也就是单词的分界处。匹配单词需要使用到它。
1、匹配单个单词
匹配单个单词只要在单词的头尾分别加上“\b”元字符就可以了,以匹配“span”单词为例:
\bspan\b
2、匹配多个单词
\b(a|strong|img)\b
3、分组中匹配多个单词
正则表达式中,用小括号来指定分组(也叫子表达式),用于一次匹配多个结果。
以一段 PHP 代码为例,将一段 HTML 代码字符串中的 a、strong 和 img 标签的尖括号“<>”替换成大括号“[]”:
$ret = '<div style="font-size: 12px;">测试</div>
<div><img src="http://localhost/images/star.png"/></div>
<div><strong>下载</strong>:<a href="http://localhost/upload/star.zip">star.zip</a></div>' ;
$ret = preg_replace( '/(<)(\/?)(\b(a|strong|img)\b)(([^>]*?)?)(>)/ims' , '[$2$3$5]', $ret);
echo $ret;
输出的结果为:
<div style="font-size: 12px;">测试</div>
<div>[img src="http://localhost/images/star.png"/]</div>
<div>[strong]下载[/strong]:[a href="http://localhost/upload/star.zip"]star.zip[/a]</div>
我们来分析一下这段代码中使用的表达式:
(<)(\/?)(\b(a|strong|img)\b)(([^>]*?)?)(>)
有几对括号就有几个分组,分组的顺是从左到右,从外到内。这个表达式一共有7个分组:
(<)
(\/?)
(\b(a|strong|img)\b)
(a|strong|img)
(([^>]*?)?)
([^>]*?)
(>)
以 HTML 代码中的 <a href="http://localhost/upload/star.zip"> 标签为例,被分成7份,用 $n 的格式来标记,其中 NULL 表示空字符串:
$1=<
$2=NULL
$3=a
$4=a
$5= href="http://localhost/upload/star.zip"
$6= href="http://localhost/upload/star.zip"
$7=>
将其中的尖括号<>替换为中括号[],按格式 '[$2$3$5]' 重新拼接起来的结果如下:
[a href="http://localhost/upload/star.zip"]