Nasıl Regex Tabloları maç?

6 Cevap php

Hello I like to return the strings in this table

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

Ben de bu uğraş:

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

herkes yardımcı olabilir?

6 Cevap

.*? gibi birçok çapraşık olmayan açgözlü ifadeler kullanmayın. Onlar ne istiyorsun rağmen, onlar Backtracking bir sürü gelir ve böylece bütün ifade verimsiz olun. Eğer onlardan çok kullandığınızda özellikle.

Mümkün olduğunca açık olmaya çalışın:

#<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

Ama gördüğünüz gibi, bu bir felaket.

Sen daha iyi biri gibi bir HTML ayrıştırıcı kullanmak gerekir DOMDocument. Sonra XPath ile elemanları sorgulayabilirsiniz as Brian Agnew suggested. Bu şekilde daha güvenilir ve düzenli ifadeler daha rahat.

Çok sayıda kişi / belirttiği gibi, yukarıdaki için bir HTML / XML parser kullanarak daha iyiyiz (gibi this one). HTML düzenli değildir ve normal bir ifade kullanırsanız etrafında kodlamak için çok sayıda kenar durumlar vardır.

Sadece metin ayıklamak istiyorsanız göz önüne alındığında, belki de XPath yardımcı olacaktır. Bir ifade örneğin,

/tr/td/text()

hile yapabilirsiniz.

Deneyin:

// 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";
}

Çıktı:

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

Aksi takdirde regexp ile (multi-line seçeneği ile) bu kullanabilirsiniz:

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

@ Brian Agnew tarafından işaret Ama, bu sadece hiçbir yerde bir xml / html çözümleyici olarak iyi ...

PHP dünyasında, JS yapmak daha çok daha kolay kılan preg_match_all var.

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

In sonucu test Preg Tester