我花了好几个小时试图让这个正则表达式起作用,到目前为止,我将是一个非常令人头痛的问题!
我正在使用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);
但所有这些似乎输出都是一个空数组。谁能找到我出错的地方?
答案 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。你可以通过追加一个让星星变得懒惰来解决这个问题吗?每次之后。