繁体   English   中英

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

[英]How can I make this regular expression extract contents of certain HTML elements in my document?

我花了好几个小时试图使这个正则表达式生效,但到目前为止,我会头疼不已!

我正在使用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);

但是似乎所有这些输出都是一个空数组。 谁能发现我哪里出问题了?

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

只是让您的生活更轻松:

$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大师,所以我保持简单:-)

您似乎缺少一些换行符。 尝试

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

/ s使点与所有字符匹配(通常不与换行符匹配)。 如果遇到问题,可能是因为输出中还有其他tds或trs。 您可以通过添加?使星星变懒来解决此问题。 每次之后。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM