这个表达式很像我们上面这个例子中的那个,除了我们希望这个标记包含了一个特定的属性值。比如在你想得到含有某个特定class或者ID值的标记里面的内容时,这个表达式非常有用。这个表达式只是比前一个例子里面的稍微复杂一点(同样,里面的tag、attribute和value在实际应用中用你希望寻找的值代替):
{<tag[^>]*attribute\s*=\s*(["'])value\\1[^>]*>(.*?)</tag>}
我们用一个字符分类去允许在属性值两端的字符可以是单引号或者双引号。这里有另一个正则表达式里面的概念:反向引用(backreference)。
跟在这个正则表达式中value那个词后面的写法(在这里是\1)叫做反向引用(backreference)。在实际解析过程中,我们可以认为它将被前面这个(["'])中实际匹配到的字符代替(要么是一个单引号要么是一个双引号)。用这个技术我们可以确定这个属性值的前后两个引号是一致的。
下面是一个演示你怎么样能够使用这个表达式从一个XHTML文档中取出指定信息的PHP函数。这个函数接受属性、对应值、输入文本和一个可选的标记名称做为参数。如果不指定标记名称,它将匹配所有含有特定属性和对应值的标记。
function get_tag( $attr, $value, $xml, $tag=null ) {
if( is_null($tag) )
$tag = '\w+';
else
$tag = preg_quote($tag);
![]()
$attr = preg_quote($attr);
$value = preg_quote($value);
![]()
$tag_regex = "/<(".$tag.")[^>]*$attr\s*=\s*".
"(['\"])$value\\2[^>]*>(.*?)<\/\\1>/"
![]()
preg_match_all($tag_regex,
$xml,
$matches,
PREG_PATTERN_ORDER);
![]()
return $matches[3];
}
