2012-06-25 156 views
0

我有這樣給出:PHP:查找字符串preg_match_all

<tr class="tth3"> 
    <td>aaa - bbbbb</td> 
    <td>6:10 </td> 
    <td >bla</td> 
</tr> 
<tr class="tth3"> 
    <td>cccc - xxxx</td> 
    <td>6:10 </td> 
    <td>blabla</td> 
</tr> 

,我會檢索算法這個表達式:preg_match_all('/<tr class="tth3">.*?xxx.*?<\/[\s]*tr>/s', ...) 我的結果應該是隻有謝勝利<tr>..</tr>,但我不知道如何使用這個正確的這樣誰能幫我??

+4

歡迎來到Stack Overflow!請不要使用RegEx解析HTML,因爲它會[驅動你瘋狂](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) 。改爲使用[HTML解析器](http://stackoverflow.com/questions/292926/robust-mature-html-parser-for-php)。 –

回答

2

使用更好的解決方案,與DOM

<?php 

/** 
* Got this function from the manual's comments 
* 
* @param DOMNode $el 
* 
* @return mixed 
*/ 
function innerHTML(DOMNode $el) { 
    $doc = new DOMDocument(); 
    $doc->appendChild($doc->importNode($el, TRUE)); 
    $html = trim($doc->saveHTML()); 
    $tag = $el->nodeName; 
    return preg_replace('@^<' . $tag . '[^>]*>|</' . $tag . '>[email protected]', '', $html); 
} 


$html = <<<HTML 
<tr class="tth3"> 
    <td>aaa - bbbbb</td> 
    <td>6:10 </td> 
    <td >bla</td> 
</tr> 
<tr class="tth3"> 
    <td>cccc - xxxx</td> 
    <td>6:10 </td> 
    <td>blabla</td> 
</tr> 
HTML; 

$document = new DOMDocument(); 
$document->loadHTML($html); 

$tr_list = $document->getElementsByTagName("tr"); 

foreach ($tr_list as $tr) { 
    /** @var $tr DOMElement */ 
    $td_list = $tr->getElementsByTagName("td"); 
    foreach ($td_list as $td) { 
     if (preg_match("/xxxx/", $td->textContent)) { 
      //This is our TR!! 
      echo innerHTML($tr); 
      break(2); //Exit both loops 
     } 
    } 
} 
+0

THX, 但這不解決我的問題! 我只在這些內部tr中與「xxx」匹配! – user1480467

+0

@ user1480467:你沒有說,你說你想要第二個tr。我將編輯我的代碼以進行補償。 –

+0

對不起......這是我的表情:/ 。*?xxx。*? <\/[\s]*tr>/s並且裏面有「xxx」:) – user1480467

0

我不認爲把\s類括號內是必要的,它甚至可能會被解讀爲比空間類以外的東西。雖然我不是100%確定的。

[\s]

無論哪種方式,用法是:

$num_matches = preg_match_all('/<tr class="tth3">.*?xxx.*?<\/\s*tr>/s', $subject, $matches);

  1. $num_matches包含匹配的字符串的計數
  2. $matches包含實際匹配字符串的數組