我正在尝试为html代码编写一个正则表达式,如下所示:
<tr>
<td>I'm some text</td>
<td>1234</td>
<td>1231</td>
</tr>
<tr>
<td>I'm some text</td>
<td>1234</td>
<td>1231</td>
<td>7181</td>
</tr>
现在我想要一个查找每个表行的表达式,并且可以处理动态数字([0-9] {4})。所以如果有两个单元格,我想得到一个包含两个值的数组,如果有三个,我的数组中应该有三个值。
我的正则表达式以开始和结束:
!<tr> ..... </tr>!sU
这可能吗?
答案 0 :(得分:2)
这应该可以帮助你开始
$html = ...as above
preg_match_all('~<tr>.+?(\d+).+?</tr>~si', $html, $matches);
print_r($matches);
答案 1 :(得分:1)
regexp在评估层次结构时非常糟糕,尤其是xml。使用SimpleXML或DOMDocument和DOMXPath
会好得多有关如何在SimpleXML中使用Xpath
,请参阅http://www.php.net/manual/en/simplexmlelement.xpath.php和
http://www.php.net/manual/en/domxpath.evaluate.php了解如何使用DOMXPath。
请注意,如果您的案例与问题中给出的一样简单,那么SimpleXML是更好的选择。在某些情况下,DOMDocument会更合适,因此为该决定提供更多信息会很好
例如:
<?php
$string = <<<XML
<table>
<tr>
<td>I'm some text</td>
<td>1234</td>
<td>1231</td>
</tr>
<tr>
<td>I'm some text</td>
<td>1234</td>
<td>1231</td>
<td>7181</td>
</tr>
</table>
XML;
$xml = new SimpleXMLElement($string);
/* Search for <a><b><c> */
$result = $xml->xpath('//tr/td[text() = number(text())');
while(list( , $node) = each($result)) {
echo $node,"\n";
}
?>
答案 2 :(得分:1)
现在我想要一个查找每个表行的表达式,并且可以处理动态数字([0-9] {4})。所以如果有两个单元格,我想得到一个带有两个值的数组,如果有三个,我的数组中应该有三个值。 (...)这可能吗?
不,不是。您无法编写具有动态数量的子模式的模式。
我的正则表达式开始和结束:
!<tr> ..... </tr>!sU
为什么?
如果你真的想使用正则表达式而不是使用XML解析器或像Tidy那样更宽容的东西,我建议采用两步法。
第一步:查找<tr>
行:
!<tr>(.*?)</tr>!
第二步:迭代结果并查找<td>
s:
!<td>(?:<[^>]+>)*(\d{4})(?:<[^>]+>)*</td>!
这将在<td>
中找到4个十进制字符(0-9)的序列,并且还匹配嵌套的格式标签,如
<td><strong>1234</strong></td>