Php 在特定字符串后使用preg_match查找模式的所有连续出现
我有一个巨大的html文档,其中包含具有唯一表ID的不同表。比如: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<
<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是一个更好的解决方案。它只捕获一个匹配元素中的所有行。啊,抱歉,我错过了。