如何使这个正则表达式提取文档中某些HTML元素的内容?

时间:2010-10-14 23:51:35

标签: php html regex

我花了好几个小时试图让这个正则表达式起作用,到目前为止,我将是一个非常令人头痛的问题!

我正在使用cURL将页面加载到变量$ o中。现在,本页的某处是:

        <tr valign="top">
   <td>value1</td>
   <td>value2</td>
   <td align="right">value3</td>
  </tr>

这重复了3次左右,当然,我想抓住value1,value2,value3并将它们存储在一个数组中。这是我的尝试:

  preg_match_all('/<tr valign="top"><td>(.*)<\/td><td>(.*)<\/td><td align="right">(.*)<\/td><\/tr>/',
                        $o,
                        $out);

但所有这些似乎输出都是一个空数组。谁能找到我出错的地方?

3 个答案:

答案 0 :(得分:5)

不要使用正则表达式来解析HTML。使用HTML解析器。

答案 1 :(得分:1)

让你的生活更轻松:

$dom = new SimpleXmlElement($curlResponse);
$candidates = $dom->xpath("tr[@valign='top']");

foreach($candidates as $tr)
{
   if(count($tr->td) == 3 && (isset($tr->td[2]['align']) &&  $tr->td[2]['align']== 'right'))
   {
      foreach($tr->td as $td)
      {
          // do something with value $td
      }
   }
}

你甚至可能只是简单地通过将一些测试直接移到xpath表达式中来找到结构中的唯一td签名,然后返回到父tr并重复遍历td的...但我远离xpath大师,所以我保持简单: - )

答案 2 :(得分:0)

看起来你错过了一些换行符。尝试

  preg_match_all('/<tr valign="top">.*<td>(.*)<\/td>.*<td>(.*)<\/td>.*<td align="right">(.*)<\/td>.*<\/tr>/s',
                    $o,
                    $out);

/ s使点匹配所有字符(通常它与新行不匹配)。如果遇到问题,可能是因为输出中还有其他tds或trs。你可以通过追加一个让星星变得懒惰来解决这个问题吗?每次之后。