PHP Regex:可能出现多次的子模式

时间:2009-10-27 09:34:46

标签: php regex

我正在尝试为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

这可能吗?

3 个答案:

答案 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>