2012-09-10 77 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' ]); 
        } 
       } 
      }