首页 > 解决方案 > PHP 简单 Dom、正则表达式替换和自动增加变量

问题描述

我正在抓取一个带有如下表格内容的页面:

<table border="1" style="width:100%;" cellspacing="0" cellpadding="3">
<tr class="stats-section">
<td colspan="99">Scoring</td>
</tr>
<tr class="stats-section">
<td colspan="99">2nd Period</td>
</tr>
<tr class="hscore">
<td>UMD</td>
<td>4&#215;4</td>
<td>
Kobe Roth (1)</td>
<td>                Noah Cates, Casey Gilling           </td>
<td align="right">12:35</td>
</tr>
<tr class="vscore">
<td>BSU</td>
<td>4&#215;4</td>
<td>
Alex Ierullo (1)</td>
<td>                Kyle Looft          </td>
<td align="right">13:06</td>
</tr>
<tr class="stats-section">
<td colspan="99">3rd Period</td>
</tr>
<tr class="hscore">
<td>UMD</td>
<td></td>
<td>
Blake Biondi (1)</td>
<td>                Quinn Olson         </td>
<td align="right">10:10</td>
</tr>
</table>

我想匹配 <tr class="hscore" 和 <tr class="vscore 并将它们更改为以下内容:

<tr class="hscore">
<td>#1 UMD</td> <!--added #1 -->
...
<tr class="vscore">
<td>#2 BSU</td> <!-- added #2 -->
...
</tr></table>

我不知道每个 hscore 或 vscore 条目的顺序是什么,甚至不知道有多少。我需要在每次匹配时自动增加一个变量 ($i++;) 以回显 #1 和 #2。正则表达式是我最好的选择吗?也许 str_replace 或者 Simple Dom 和 foreach 更好?

我想不出在每场比赛中添加到 $i 变量的方法。

标签: phphtml-table

解决方案


使用 xpath。

$xml = simplexml_load_string($html);

$trs = $xml->xpath("//tr[@class='hscore']");
$i = 1;
foreach ($trs as $tr) {
    $tr->td[0] = "#$i ".$tr->td[0];
    ++$i; 
}

$trs = $xml->xpath("//tr[@class='vscore']");
$i = 1;
foreach ($trs as $tr) {
    $tr->td[0] = "#$i ".$tr->td[0];
    ++$i; 
}

echo '<pre>' . htmlentities($xml->asXML()) . '<?pre>';

<?xml version="1.0"?>
<table border="1" style="width:100%;" cellspacing="0" cellpadding="3">
<tr class="stats-section">
<td colspan="99">Scoring</td>
</tr>
<tr class="stats-section">
<td colspan="99">2nd Period</td>
</tr>
<tr class="hscore">
<td>#1 UMD</td>
<td>4&#xD7;4</td>
<td>
Kobe Roth (1)</td>
<td>                 Noah Cates, Casey Gilling            </td>
<td align="right">12:35</td>
</tr>
<tr class="vscore">
<td>#1 BSU</td>
<td>4&#xD7;4</td>
<td>
Alex Ierullo (1)</td>
<td>                 Kyle Looft            </td>
<td align="right">13:06</td>
</tr>
<tr class="stats-section">
<td colspan="99">3rd Period</td>
</tr>
<tr class="hscore">
<td>#2 UMD</td>
<td/>
<td>
Blake Biondi (1)</td>
<td>                 Quinn Olson            </td>
<td align="right">10:10</td>
</tr>
</table>

推荐阅读