Web程序员必须掌握的五个正则表达式
匹配一个XHTML/XML 标记
如果你想抓取一个站点的数据或者试图快速从一个XML文档中取出信息的话,关于匹配一个XML 或者XHTML的标记的表达式将会非常有用。下面这个简单的正则表达式就可以完成这类抽取工作(表达式里面的单词‘tag’ 在实际应用中可以用任何你想寻找的标记名称替换):
{<tag[^>]*>(.*?)</tag>}
这里涉及到两个正则表达式里面的概念:多数优先(greedy quantifier)和少数优先(lazy quantifier)。
我们详细说明一下:问号跟着星号的写法把表达式的计数方式变成了少数优先(lazy quantifier)。缺省情况下,正则表达式的匹配是多数优先(greedy quantifier),多数优先的意思是将匹配字符串中尽可能多的字符,相反,少数优先(Lazy quantifiers)将匹配字符串中尽可能少的字符。听上去很拗口,我们还是用这个实例来说明一下,如果你在这个例子里面使用多数优先(greedy quantifier)匹配法,我们的正则表达式将无法在下面这样的字符串下正常解析:
<tag>item 1</tag><tag>item 2</tag>
因为是多数优先,表达式将会一直匹配到最后那个>标记结束,而不是一个个>来匹配,这样得到的内容是:>item 1</tag><tag>item 2</tag,和我们希望的item 1相去甚远。
下面是这个简单的PHP函数用来抽取每个匹配的XML或者XHTML标记里面的内容到一个数组:
如果你想抓取一个站点的数据或者试图快速从一个XML文档中取出信息的话,关于匹配一个XML 或者XHTML的标记的表达式将会非常有用。下面这个简单的正则表达式就可以完成这类抽取工作(表达式里面的单词‘tag’ 在实际应用中可以用任何你想寻找的标记名称替换):
{<tag[^>]*>(.*?)</tag>}
这里涉及到两个正则表达式里面的概念:多数优先(greedy quantifier)和少数优先(lazy quantifier)。
我们详细说明一下:问号跟着星号的写法把表达式的计数方式变成了少数优先(lazy quantifier)。缺省情况下,正则表达式的匹配是多数优先(greedy quantifier),多数优先的意思是将匹配字符串中尽可能多的字符,相反,少数优先(Lazy quantifiers)将匹配字符串中尽可能少的字符。听上去很拗口,我们还是用这个实例来说明一下,如果你在这个例子里面使用多数优先(greedy quantifier)匹配法,我们的正则表达式将无法在下面这样的字符串下正常解析:
<tag>item 1</tag><tag>item 2</tag>
因为是多数优先,表达式将会一直匹配到最后那个>标记结束,而不是一个个>来匹配,这样得到的内容是:>item 1</tag><tag>item 2</tag,和我们希望的item 1相去甚远。
下面是这个简单的PHP函数用来抽取每个匹配的XML或者XHTML标记里面的内容到一个数组:
function get_tag( $tag, $xml ) { $tag = preg_quote($tag); preg_match_all('{<'.$tag.'[^>]*>(.*?)</'.$tag.'>.'}', $xml, $matches, PREG_PATTERN_ORDER); return $matches[1]; }
0
相关文章