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 在特定字符串后使用preg_match查找模式的所有连续出现_Php_Regex_Html Parsing - Fatal编程技术网

Php 在特定字符串后使用preg_match查找模式的所有连续出现

Php 在特定字符串后使用preg_match查找模式的所有连续出现,php,regex,html-parsing,Php,Regex,Html Parsing,我有一个巨大的html文档,其中包含具有唯一表ID的不同表。比如: <table class="my_table" id="table_id1"> <tr class="odd"><td>Line 1</td></tr> <tr class="even"><td>Line 2</td></tr> <tr class="odd"><td>Line 3<

我有一个巨大的html文档,其中包含具有唯一表ID的不同表。比如:

<table class="my_table" id="table_id1">
  <tr class="odd"><td>Line 1</td></tr>
  <tr class="even"><td>Line 2</td></tr>
  <tr class="odd"><td>Line 3</td></tr>
  <tr class="even"><td>Line 4</td></tr>
</table>
<table class="my_table" id="table_id2">
  <tr class="odd"><td>Line 1</td></tr>
  <tr class="even"><td>Line 2</td></tr>
  <tr class="odd"><td>Line 3</td></tr>
</table>

第1行
第2行
第3行
第4行
第1行
第2行
第3行
是否可以使用preg_match查找特定表中所有行的HTML

我尝试了以下代码:

preg_match('/<table[^>]*id="table_id2">(<tr[^>]*><td>[^>]*<\/td><\/tr>)+/', $html, $matches); 
//$html variable contains the html.
preg_match('/]*id=“table_id2”>(]*>[^>]*)+/',$html,$matches);
//$html变量包含html。
但它返回的输出如下所示:

Array
(
    [0] => Array
        (
            [0] => <table class="my_table" id="table_id2"><tr class="odd"><td>Line 1</td></tr><tr class="even"><td>Line 2</td></tr><tr class="odd"><td>Line 3</td></tr>
        )

    [1] => Array
        (
            [0] => <tr class="odd"><td>Line 3</td></tr>
        )

)
数组
(
[0]=>阵列
(
[0]=>第1行第2行第3行
)
[1] =>阵列
(
[0]=>第3行
)
)
但我需要这样的输出:

Array
(
    [0] => Array
        (
            [0] => <table class="my_table" id="table_id2"><tr class="odd"><td>Line 1</td></tr><tr class="even"><td>Line 2</td></tr><tr class="odd"><td>Line 3</td></tr>
        )

    [1] => Array
        (
            [0] => <tr class="odd"><td>Line 1</td></tr>
            [1] => <tr class="odd"><td>Line 2</td></tr>
            [2] => <tr class="odd"><td>Line 3</td></tr>
        )

)
数组
(
[0]=>阵列
(
[0]=>第1行第2行第3行
)
[1] =>阵列
(
[0]=>第1行
[1] =>第2行
[2] =>第3行
)
)
可能吗?请帮忙。

试试看。这与您所看到的非常相似,但我在每行周围放置了一个非捕获分组,以及每行中的一些前导和尾随可选空格

作为参考,使用的正则表达式为

/<table[^>]*id="table_id2">((?:\s*<tr[^>]*><td>[^>]*<\/td><\/tr>\s*)+)/
/]*id=“table_id2”>(((?:\s*]*>[^>]*\s*)+)/

不应使用正则表达式解析HTML。PHP有一个很好的工具来实现这一点-。使用它,你可以做很多事情,这在正则表达式中是不可能的。您的样本将如下所示:

$sHtml = '<table class="my_table" id="table_id1">
  <tr class="odd"><td>Line 1</td></tr>
  <tr class="even"><td>Line 2</td></tr>
  <tr class="odd"><td>Line 3</td></tr>
  <tr class="even"><td>Line 4</td></tr>
</table>
<table class="my_table" id="table_id2">
  <tr class="odd"><td>Line 1</td></tr>
  <tr class="even"><td>Line 2</td></tr>
  <tr class="odd"><td>Line 3</td></tr>
</table>';

$rDoc   = new DOMDocument();
$rDoc->loadHTML($sHtml);
$sId    = 'table_id2';
//found table:
$rTable = $rDoc->getElementById($sId);
foreach($rTable->childNodes as $rItem)
{
   //do something with item:
   //var_dump($rItem);
}
$sHtml='1〕
第1行
第2行
第3行
第4行
第1行
第2行
第3行
';
$rDoc=新的DOMDocument();
$rDoc->loadHTML($sHtml);
$sId='table_id2';
//查找表:
$rTable=$rDoc->getElementById($sId);
foreach($rTable->childNodes作为$rItem)
{
//对项目执行某些操作:
//var_dump($rItem);
}

您不使用DOM或SAX实际解析HTML有什么原因吗?这可能会更简单、更可靠。不要使用正则表达式来解析HTML。使用适当的HTML解析模块。您无法用正则表达式可靠地解析HTML,在这条路上您将面临悲伤和挫折。一旦HTML改变了您的预期,您的代码就会被破坏。有关如何使用已编写、测试和调试的PHP模块正确解析HTML的示例,请参阅或。是的,我认为DOMDocument是一个更好的解决方案。它只捕获一个匹配元素中的所有行。啊,抱歉,我错过了。