[英]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.