代码之家  ›  专栏  ›  技术社区  ›  streetparade

regex表如何匹配?

  •  0
  • streetparade  · 技术社区  · 15 年前

    我想把这张桌子上的弦还回去

    <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 回复  |  直到 15 年前
        1
  •  1
  •   Gumbo    15 年前

    不要使用许多不精确的非贪婪的表达,比如 .*? . 尽管它们做了你想要的,但是它们带来了大量的回溯,从而使你的整个表达效率低下。尤其是当你用了这么多的时候。

    尽量明确:

    #<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 . 然后您可以像BrianAgnew建议的那样使用xpath查询元素。这比正则表达式更可靠、更舒适。

        2
  •  3
  •   Brian Agnew    15 年前

    正如许多人会/已经指出的那样,使用HTML/XML解析器进行上述分析(如 this one )HTML不是常规的,如果使用正则表达式,则有许多边缘情况需要进行编码。

    如果您只想提取文本,那么xpath可能会有所帮助。一种表达式,如:

    /tr/td/text() 
    

    可能会成功。

        3
  •  1
  •   Bart Kiers    15 年前

    尝试:

    // 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
    
        4
  •  0
  •   Locksfree    15 年前

    否则,对于regexp,可以使用它(使用多行选项):

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

    但是正如@brian agnew所指出的,这并没有XML/HTML解析器那么好……

        5
  •  0
  •   knittl    15 年前

    是不是 strip_tags 选择权?

    它将删除所有标记,只在标记之间保留文本。但它也会去掉属性

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

      01.10.2009
       AN09551
         [2009132] Ich bin Un. 
       7.500,00 € 
        Entwurf
    
        6
  •  0
  •   unigg    15 年前

    在PHP世界中,有preg-match-all,这使得它比JS容易得多。

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

    测试结果 Preg Tester