搜索

首页  >  问答  >  正文

GetElementsByTagName 格式过滤器(需要紧急帮助)

我正在尝试格式化通过 getElementsByTagName 获得的 NodeList,实际上我可以获取每个标签的内容,但我无法过滤,我正在尝试使输出如下:

EXAMPLE:

name: jhon doe
number: 12345678
date: 00/00/0000

但我只得到正常内容:

JOHN DOE
12345678
00/00/0000
lane DOE
7234567890
00/30/0000

或者如果我使用 [0],它仅返回每个标签的第一个字母/数字。

J
1
0
l
7
3

我当前的代码如下,有什么关于我可以做什么的提示吗?

<?php
$string = '
<tbody>
<tr>
<td>JOHN DOE</td>
<td style="background-color: rgb(25, 194, 25);">12345678</td>
<td>00/00/0000</td>
</tr>
<tr>
<td>lANE DOE</td>
<td style="background-color: rgb(25, 194, 25);">7234567890</td>
<td>30/00/0000</td>
</tr>
</tbody>';
$dom = new DOMDocument();
$dom->loadHTML($string);
foreach($dom->getElementsByTagName('td') as $td) {
    echo $td->textContent[0] . '<br/>';
}

P粉518799557P粉518799557226 天前501

全部回复(2)我来回复

  • P粉464208937

    P粉4642089372024-04-02 19:49:46

    您犯的错误是您使用了 td 标记,它不会返回每个记录,而是返回每个值(查看您的代码)。

    首先你应该使用“tr”标签

    其次,您应该使用nodeValue通过提及索引来获取任何特定项目的数据

    给出更正后的代码供您参考,有任何不清楚的地方请随时提问

    
    
    JOHN DOE
    12345678
    00/00/0000
    
    
    lANE DOE
    7234567890
    30/00/0000
    
    ';
    $dom = new DOMDocument();
    $dom->loadHTML($string);
    $tr = $dom->getElementsByTagName('tr');
    echo $tr->item(0)->nodeValue;

    如果你想输出所有的项目,你可以简单地使用循环

    回复
    0
  • P粉546257913

    P粉5462579132024-04-02 12:23:08

    您期望姓名号码日期来自哪里? PHP 不知道表值的含义,因此您必须以某种方式自行设置它们。

    HTML 中没有指示每个表格单元格的含义,因此您只能猜测并希望表格结构永远不会改变。这些表格按名称 - 数字 - 日期排序,因此您可以从单元格编号中推断出特定 的标签必须为:0 = 名称、1 = 数字、2 = 日期。

    因此,如果您解析每个表格的 HTML,然后解析每个表格单元格的每行,您可以根据单元格顺序添加标签。

    但是请注意,如果 HTML 的内容来自外部源并且它们更改了单元格的顺序,则会出错。

    //create an array of labels, based on the cell order per row
    $labels=[
        0=>'name',
        1=>'number',
        2=>'date'
        ];
    
    $dom = new DOMDocument();
    $dom->loadHTML($string);
    
    // search for table ROWS
    $table_rows = $dom->getElementsByTagName('tr');
    
    //loop the ROWS
    foreach($table_rows as $row){
       //per ROW node, search for table CELLS
       $row_cells = $row->getElementsByTagName('td');
       //loop the CELLS
       foreach($row_cells as $number => $cell){
         //echo a label based on the cell order + the contents of the cell
         echo $labels[$number].' - '.$cell->textContent.'
    '; } }

    回复
    0
  • 取消回复