正则表格如何匹配?

时间:2009-10-02 09:32:08

标签: php html regex parsing

我想在此表中返回字符串

<tr class="rowodd" onclick="window.location.href='/portal/offers/show/entityId/32114';">
  <td>01.10.2009</td>
   <td>AN09551</td>
     <td>[2009132] Ich bin Un.&nbsp;<a href="/portal/clients/show/entityId/762350"><myimsrc="/img/bullet_go.pngs" alt="" title="Kundenakte aufrufen"></a></td>
   <td class="number" title="7.500,00Â&nbsp;€">7.500,00Â&nbsp;</td>
    <td>Entwurf</td>
     </tr> 

我试过了这个:

#<tr>.*?<t.*?>(.*?)</t.*?>.*?<t.*?>(.*?)</t.*?>.*?<t.*?>(.*?)</t.*?>.*?</tr>#s

任何人都可以帮忙吗?

6 个答案:

答案 0 :(得分:3)

正如许多人会指出的那样,你最好使用HTML / XML解析器(如this one)。 HTML不是常规的,如果你使用正则表达式,有许多边缘情况可以编码。

鉴于您只想提取文本,XPath可能会有所帮助。表达式如:

/tr/td/text() 

可能会做到这一点。

答案 1 :(得分:1)

尝试:

// http://simplehtmldom.sourceforge.net/
include('simple_html_dom.php');
$str = '<tr class="rowodd" onclick="window.location.href=\'/portal/offers/show/entityId/32114\';">
  <td>
    01.10.2009
  </td>
  <td>
    AN09551
  </td>
  <td>
    [2009132] Ich bin Un. <a href="/portal/clients/show/entityId/762350">
    <myimsrc="/img/bullet_go.pngs" alt="" title="Kundenakte aufrufen"></a>
  </td>
  <td class="number" title="7.500,00">
    7.500,00
  </td>
  <td>
    Entwurf
  </td>
</tr>';
$html = str_get_html($str);
foreach($html->find('td') as $element) {
  echo trim($element->innertext) . "\n";
}

输出:

01.10.2009
AN09551
[2009132] Ich bin Un. <a href="/portal/clients/show/entityId/762350">
    <myimsrc="/img/bullet_go.pngs" alt="" title="Kundenakte aufrufen"></a>
7.500,00
Entwurf

答案 2 :(得分:1)

不要使用像.*?这样的许多不明确的非贪婪表达式。虽然他们做你想做的事,但是他们会带来许多回溯,从而使你的整个表达效率低下。特别是当你使用这么多时。

尽量明确:

#<tr\b(?:[^"'>]*|"[^"]*"|'[^']*')*>\s*
    <td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
    <td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
    <td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
    <td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
    <td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
</tr\s*>#sx

但是如你所见,这是一团糟。

您应该更好地使用像DOMDocument那样的HTML解析器。然后你可以像Brian Agnew建议的那样使用XPath查询元素。这比正则表达式更可靠,更舒适。

答案 3 :(得分:0)

不是strip_tags选项吗?

它会删除所有标签,只留下标签之间的文本。它也剥离了属性

在你的情况下,这将导致:

  01.10.2009
   AN09551
     [2009132] Ich bin Un. 
   7.500,00 € 
    Entwurf

答案 4 :(得分:0)

否则使用正则表达式可以使用它(使用多行选项):

(?:\<td[^\>]*?\>([^\<]*?)\</td\>)+

但正如@Brian Agnew指出的那样,这就像xml / html解析器一样好......

答案 5 :(得分:0)

在PHP世界中,有preg_match_all,它比JS更容易。

$ptn = "/<\s*td[^>]*>([^<^>]*)</;
preg_match_all($ptn, $str, $matches);
print_r($matches);

Preg Tester

中测试结果