Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多表的PHP正则表达式_Php_Regex_Preg Match All - Fatal编程技术网

多表的PHP正则表达式

多表的PHP正则表达式,php,regex,preg-match-all,Php,Regex,Preg Match All,我需要帮助为文本分隔构建正则表达式。 现在我有一些文本,比如 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 clas

我需要帮助为文本分隔构建正则表达式。 现在我有一些文本,比如

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
text text text
text text text
<div> text text text </div>
<table class="table1">
<tr>
<td>
</td>
</tr>
</table>
text
文本文本文本
文本文本文本
文本文本文本
文本文本文本
文本文本文本
文本文本文本
文本文本文本
文本文本文本
我需要创建一个正则表达式来分隔文本和表。 现在我有了正则表达式

preg_match_all( "/(.*)(<table(?s).*?\/table>)(.*)/si", $value[ 'TEXT' ], $matches );
preg_match_all(“/(.*)()(.*))/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
text text text
<table class="table2">
<tr>
<td>
</td>
</tr>
</table>
text text text
text text text
text text text
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
<div> text text text </div>
text
文本文本文本
文本文本文本


但是对于文本

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
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"
[0]=>“文本
文本文本文本
文本文本文本
文本文本文本
文本文本文本
文本“,
[1]=>"
",
[2] =>“文本
文本文本文本
“文本”

如何构建正确的正则表达式?

它应该围绕以下内容:

$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、查找和删除表、查找所有TextNode并用它们的内容填充数组。您应该阅读更多关于根据需要对其进行微调的内容。

去掉正则表达式开头和结尾的
(.*)
。只有在使用Java的
matches()
方法自动在两端锚定匹配时,才需要“填充”这样的正则表达式


这里发生的事情是,第一个
(.*)
最初会吞噬整个文档,然后后退到足以让下一部分(
最佳解决方案是以下代码:

$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' ] );
                    }
                }
            }
$test=preg_replace(“//si”,”,$value['TEXT']);
$text=爆炸(“”,$test);
foreach($keyTEXT=>$valueTEXT的文本)
{
$TmpVal=str_replace(“\r”,”,$valueTEXT);
$TmpVal=str_replace(“\n”、”、$TmpVal);
$TmpVal=str\u replace(“\r\n”,”,$TmpVal);
如果(修剪($TmpVal)!='')
{
preg_match_all(“/\w/”,$TmpVal,$mtchs);
如果(计数($MTCH[0])>0)
{
$value['TEXT']=str_replace($valueTEXT,'.$valueTEXT.'',$value['TEXT']);
}
}
}

The.OK。可以删除表。但是我需要原始序列中的文本片段来将每个片段包装到div中。例如,
piece1***piece2***piece3
更新了代码,如果仍然不起作用,你应该在google上搜索
xpath
PHPDOM
教程。它们应该会帮助你。如果不起作用,问一个关于你是新密码。