0

我想从 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 等更快。请不要对此发表评论。

4

2 回答 2

1

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

于 2012-04-27T11:45:49.487 回答
0

好的 ol' Manfred 缺少 title 属性。

这适用于这些情况:

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

我对此不太了解:请参阅 Stackoverflow 上投票第二多的问题。我建议你阅读全文:

RegEx 匹配打开的标签,XHTML 自包含标签除外

于 2012-04-27T11:45:30.353 回答