preg_match显示一个额外的空匹配

时间:2012-04-27 11:23:21

标签: php preg-match preg-match-all

我想从html标签中提取作者姓名。标签看起来像这样:

<a href="http://somewhere.com">    Manfred    </a>

但是如果名字很长,它看起来像这样:

<a title="floormanager004" href="http://somewhere.com">    floormanage...    </a>

我有以下正则表达式来涵盖这两种情况:

~<a.*(title="(.{2,50})".*|>(.*))</a>~Usi

这在第二种情况下工作正常,返回一个二维数组,如下所示:

array(2) {
  [0]=>
  string "title="floormanager004" href="http://somewhere.com">    floormanage...    "
  [1]=>
  string "floormanager004"
}

但是对于第一种情况,该数组包含一个额外的空字段:

array(2) {
  [0]=>
  string ">    Manfred    "
  [1]=>
  string ""
  [2]=>
  string "    Manfred    "
}

为什么会显示此字段以及如何摆脱它?

声明: 我知道当使用正则表达式解析HTML时,你会有一个baaaaad时间,你永远不应该这样做,但在我的情况下,它被证明比XPATH等更快。请不要对此发表评论。

2 个答案:

答案 0 :(得分:1)

每次在整个正则表达式上成功匹配时,每组括号都会在返回的数组中有一个关联的值,即使括号位匹配的内容是什么也没有。当某些捕获可能为空时,您的代码需要检测并处理该情况。

答案 1 :(得分:0)

好的ol&#39;缺少title属性。曼弗雷德。

适用于这些情况:

~<a.*>(.*)</a>~Usi

我无法理解这一点:请参阅Stackoverflow上投票率第二高的问题。我建议你阅读整篇文章:

RegEx match open tags except XHTML self-contained tags