使用PHP解析复杂的HTML表

时间:2013-11-01 13:52:12

标签: php html domdocument domxpath

我使用以下PHP代码成功解析了动态表:

$docH = new DOMDocument();
$docH->loadHTMLFile($url);

//get everything inside the body element:
$bodyH = $docH->getElementsByTagName('body')->item(0);

foreach ($bodyH->childNodes as $childNode) {
       echo $docH->saveHTML($childNode);
} 

解析HTML表:

<table>
    <tr>
        <td>5CG</td>
        <td>aass</td>
        <td>sxs</td>
        <td>sx</td>
        <td>EK</td>
        <td></td>
        <td>72</td>
    </tr>
    <td></td>
    <td>samplxs</td>
    <td>xs</td>
    <td></td>
    <td>xss</td>
    <td>fkxsx aus</td>
    <td>s</td>
    </tr>
    <td></td>
    <td>5AH.</td>
    <td>ds</td>
    <td>d</td>
    <td>sdf</td>
    <td>sdfsdf aus</td>
    <td></td>
    </tr>
    <tr>
        <td>6CG</td>
        <td>3.</td>
        <td>sfd</td>
        <td></td>
        <td>scs</td>
        <td>das aus</td>
        <td>a</td>
    </tr>
    <tr>
        <td>7DG</td>
        <td>6.</td>
        <td>s</td>
        <td>s</td>
        <td>sD</td>
        <td>sdsa.</td>
        <td></td>
    </tr>
    <td></td>
    <td>samplxs</td>
    <td>xs</td>
    <td></td>
    <td>xss</td>
    <td>fkxsx aus</td>
    <td>s</td>
    </tr>
    <tr>
        <td>7DG, 7CG, 7CR</td>
        <td>6.</td>
        <td>NsdR</td>
        <td>s</td>
        <td>SP</td>
        <td>fasdlt aus</td>
        <td>s</td>
    </tr>
    <td></td>
    <td>samplxs</td>
    <td>xs</td>
    <td></td>
    <td>xss</td>
    <td>fkxsx aus</td>
    <td>s</td>
    </tr>
    <tr>
        <td>9BR</td>
        <td>6.</td>
        <td>FEI</td>
        <td>sa</td>
        <td>DE</td>
        <td>fasdad aus</td>
        <td></td>
    </tr>
    <tr>
        <td>9AR, 9BR, 9CR</td>
        <td>62.</td>
        <td>BEH</td>
        <td></td>
        <td>sd</td>
        <td>fasda aus</td>
        <td></td>
    </tr>
    <tr>
        <td></td>
        <td>6.</td>
        <td>MLR</td>
        <td></td>
        <td>FdR</td>
        <td>fsdfaus</td>
        <td></td>
    </tr>
    <tr>
        <td>E10C</td>
        <td>6.</td>
        <td>sdf</td>
        <td>d</td>
        <td>d</td>
        <td>fsdfs aus</td>
        <td></td>
    </tr>
    <tr>
</table>

但我的目标是只询问<tr>个元素,其中第一个<td>的第一个<tr>包含一些文字,直到显示用户想要的表格内容为止还有另一个<tr>,其中第一个<td>具有不同的内容。

例如:如果用户在输入字段中键入“9BR”,我只是希望他看到:

9BR 6。 FEI SA DE fasdad aus     9AR,9BR,9CR     62。     BEH          SD     fasda aus               6。     MLR          FDR     fsdfaus     

如果他输入5CG:

<tr>
    <td>5CG</td>
    <td>aass</td>
    <td>sxs</td>
    <td>sx</td>
    <td>EK</td>
    <td></td>
    <td>72</td>
</tr>
<td></td>
<td>samplxs</td>
<td>xs</td>
<td></td>
<td>xss</td>
<td>fkxsx aus</td>
<td>s</td>
</tr>

或者如果6CG只是:

<tr>
    <td>6CG </td>
    <td>3. </td>
    <td>sfd </td>
    <td> </td>
    <td>scs </td>
    <td>das aus</td>
    <td>a </td>
</tr>

1 个答案:

答案 0 :(得分:2)

使用XPath,这样的事情应该可以解决问题 http://de3.php.net/manual/en/class.domxpath.php

$xpath = new DomXpath($docH);
$trs = $xpath->query('//tr[td[1][contains(text(), "BR9")]]');
  

找到所有tr,其中第一个td包含文本“nothing”

至于以下'空首先td的' 这可能不是查询它的最优雅的形式,但可以工作:

$query = '
//tr[td[1][contains(text(), "anything")]]
 |
//tr[td[1][contains(text(), "anything")]]
     /following-sibling::tr[td[1][not(text())] and preceding-sibling::tr[1][td[1][not(text()) or contains(text(), "anything")]]]
';
  

找到所有tr,其中第一个td包含文本“nothing”

     

还找到所有第一个td为空的其前一个兄弟姐妹(trs)第一个td   也是空的或包含文本“任何”

示例:http://3v4l.org/q6eDu