用PHP解析复杂的HTML表

用PHP解析复杂的HTML表,php,html,domdocument,domxpath,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-

我使用以下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>

5CG
原子吸收光谱法
sxs
sx
埃克
72
样本数
xs
xss
fkxsx澳大利亚
s
5啊。
ds
D
自卫队
澳大利亚
6CG
3.
sfd
scs
达斯奥斯酒店
A.
7DG
6.
s
s
sD
sdsa。
样本数
xs
xss
fkxsx澳大利亚
s
7DG、7CG、7CR
6.
NsdR
s
服务提供商
时尚澳大利亚酒店
s
样本数
xs
xss
fkxsx澳大利亚
s
9BR
6.
菲
sa
判定元件
法斯达德奥斯酒店
9AR、9BR、9CR
62
贝赫
sd
法斯达奥斯酒店
6.
MLR
罗斯福
fsdfaus
E10C
6.
自卫队
D
D
澳大利亚
但我的目标是通过只要求
元素来显示用户想要的表的内容,其中第一个
的第一个
包含一些文本,直到有另一个
的第一个
具有不同的内容

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

9BR 6. 菲 sa 判定元件 法斯达德奥斯酒店 9AR、9BR、9CR 62 贝赫 sd 法斯达奥斯酒店 6. MLR 罗斯福 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>

5CG
原子吸收光谱法
sxs
sx
埃克
72
样本数
xs
xss
fkxsx澳大利亚
s
或者如果6CG只是:

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

6CG
3.
sfd
scs
达斯奥斯酒店
A.

使用XPath,类似这样的东西应该可以达到目的

查找第一个td包含文本“任何内容”的所有tr

对于以下第一个为空的tr
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")]]]
';
查找第一个td包含文本“任何内容”的所有tr

还可以查找所有tr,其中第一个td为空,以及其前兄弟姐妹(tr)的第一个td
也为空或包含文本“任何内容”


示例:

使用XPath表达式获取所需内容。哇,太快了,谢谢,我要查找它。如何选择一个空的
,或者无论有多少个空格都只包含空格?太好了!但是,如何在第一个td元素中没有文本的情况下,在第一个td元素和第一个td中有其他文本的元素之间添加以下tr元素!?例如:我被迷住了!谢谢!最后一件事:我如何回显html结果?
foreach($xpath->query($query)as$res){var_dump($doc->saveHTML($res));}
-不客气:)有时我想要包含的以下空“”元素包含一个或更多的空白,而不仅仅是什么都没有……我试图添加它,但没有成功。你知道怎么改变它吗!?我想也许regex能帮上忙。
$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")]]]
';