2012-09-10 61 views
-2

我需要幫助構建正則表達式來分離文本。 現在我有一個像多表格的PHP正則表達式

text text text 
text text text 
<div> text text text </div> 
<table class="table1"> 
<tr> 
<td> 
</td> 
</tr> 
</table> 
text text text 
text text text 
text text text 
<table class="table2"> 
<tr> 
<td> 
</td> 
</tr> 
</table> 
text text text 
text text text 
text text text 

我需要創建一個正則表達式,將文本和表格分開一些文字。 現在我正則表達式

preg_match_all("/(.*)(<table(?s).*?\/table>)(.*)/si", $value[ 'TEXT' ], $matches); 

而且這種表達正常工作像

text text text 
text text text 
<div> text text text </div> 
<table class="table1"> 
<tr> 
<td> 
</td> 
</tr> 
</table> 

文本它分開到

text text text 
text text text 
<div> text text text </div> 

<table class="table1"> 
    <tr> 
    <td> 
    </td> 
    </tr> 
    </table> 

但對於t ext

text text text 
text text text 
<div> text text text </div> 
<table class="table1"> 
<tr> 
<td> 
</td> 
</tr> 
</table> 
text text text 
text text text 
text text text 
<table class="table2"> 
<tr> 
<td> 
</td> 
</tr> 
</table> 
text text text 
text text text 
text text text 

我的正則表達式不起作用。它的返回數組與

[0] =>"text text text 
    text text text 
    <div> text text text </div> 
    <table class="table1"> 
    <tr> 
    <td> 
    </td> 
    </tr> 
    </table> 
    text text text 
    text text text 
    text text text", 
[1]=>"<table class="table2"> 
    <tr> 
    <td> 
    </td> 
    </tr> 
    </table>", 
[2]=>"text text text 
    text text text 
    text text text" 

如何構建正確的正則表達式?

+1

的[強制性告誡](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained標籤都有效/ 1732454#1732454)。 –

回答

1

它應該是地方解決此問題:

$doc = new DOMDocument; 
$doc->loadHTML('html string'); 

$tables = $doc->getElementsByTagName('table'); 
foreach($tables as $table){ 
    $parent = $table->parentNode; 
    $parent->removeChild($table); 
} 

$doc->normalizeDocument(); 

$text = array(); 
$xpath = new DOMXPath($doc); 
$textnodes = $xpath->evaluate('//text()'); 
foreach($textnodes as $textnode){ 
    $text[] = $textnode->wholeText; 
} 
print_r($text) 

此代碼加載HTML,找到並刪除表,發現所有的textnodes和填充其內容的數組。您應該閱讀更多關於PHP DOM的信息,以便根據您的需求進行微調。

+0

好的。它刪除表格。但我需要原始序列中的文本片段來將每個片段包裝在div中。即'

piece1
***
piece2
***
piece3
' –

+0

第二個變體返回的所有文本,包括表格單元格中的文本...... –

+0

更新的代碼,如果仍然不工作,你應該谷歌'xpath'和'php dom'教程。他們應該幫助你。在那之後不起作用,請提出一個關於你是新代碼的問題。 – Ties

0

擺脫(.*)在你的正則表達式的開始和結束。唯一需要像這樣「填充」正則表達式的時候是當你使用類似Java的matches()方法時,自動錨定兩端的匹配。

這裏發生的一件事情是,第一個(.*)最初吞噬了整個文檔,然後退回足夠遠,讓下一部分(<table等)匹配一個表格元素。然後第二個(.*)消耗剩下的東西。這解釋了爲什麼preg_match_all()只能捕獲一個表格元素,爲什麼它總是最後一個。你也可以擺脫(?s)。它並沒有真正傷害任何東西,但它所做的只是打開single-line模式,並且您已在最後使用s修改器完成此操作。您可能打算匹配一個空白字符(這將是\s),但這會阻止它匹配<table>(即沒有屬性的表標記)。您應該使用\b(字的邊界),而不是:

preg_match_all('~<table\b.*?/table>~si', $value[ 'TEXT' ], $matches); 

但要知道,這種做法只會工作,在極其簡單的HTML。即使在完全有效的HTML中,也有很多很多東西可以擊敗它(嵌套的表格標籤是最明顯的例子)。

0

最好的解決方法是這樣的碼:

$test = preg_replace("/<table(?s).*?\/table>/si", '<BREAKHERE>', $value[ 'TEXT' ]); 

      $texts = explode('<BREAKHERE>', $test); 

      foreach ($texts as $keyTEXT => $valueTEXT) 
      { 
       $TmpVal = str_replace("\r", "", $valueTEXT); 
       $TmpVal = str_replace("\n", "", $TmpVal); 
       $TmpVal = str_replace("\r\n", "", $TmpVal); 
       if (trim($TmpVal) != '') 
       { 
        preg_match_all("/\w/", $TmpVal, $mtchs); 

        if (count($mtchs[ 0 ]) > 0) 
        { 
         $value[ 'TEXT' ] = str_replace($valueTEXT, ' <div class="panel-container">' . $valueTEXT . '</div>', $value[ 'TEXT' ]); 
        } 
       } 
      }