1

我正在从 ganon dom 解析器解析和 html dom 字符串,并且想要在前一个元素上找到匹配项时获取下一个元素纯文本,例如我的 html 就像

<tr class="last even">
   <th class="label">SKU</th>
   <td class="data last">some sku here i want to get </td> 
</tr>

我现在使用了以下代码

$html = str_get_dom('html string here');
foreach ($html('th.label') as $elem){
                if($elem->getPlainText()=='SKU'){ //this is right
                    echo $elem->getSibling(1)->getPlainText(); // this is not working
                }
            }

如果找到带有 class lable 和 innerhtml SKU的 th,则从作为SKU 值的下一个兄弟中获取 innerhtml

请帮忙解决这个问题。

4

1 回答 1

3

这可能是 html 的“ganon”中的一个错误 - 如果您以 html 为例:

$html = '<table>
                <tr class="last even">
                   <th class="label">SKU</th>
                   <td class="data last">some sku here i want to get </td> 
                </tr>
            </table>';

   $html = str_get_dom($html); 

出于某种原因,由于 html 中的新行“ganon”认为下一个元素是一个文本元素,然后才有欲望 td - 所以你必须这样做:

   foreach ($html('th.label') as $elem){
        if($elem->getPlainText()=='SKU'){ 
            //elem -> text node -> td node
            echo($elem->getSibling(1)->getSibling(1)->getPlainText()); 
        }
    }

如果你像这样组织你的html(没有新行):

$html = '<table>
                <tr class="last even">
                   <th class="label">SKU</th><td class="data last">some sku here i want to get </td> 
                </tr>
            </table>';

然后您的原始代码将起作用$elem->getSibling(1)->getPlainText()

也许考虑使用php 简单的 html dom类 - 它更直观,使用完整的 oop 方法,jquery dom 解析器,不使用这种可怕的 var-function 方法:):

require('simple_html_dom.php');

    $html = '<table>
                <tr class="last even">
                   <th class="label">SKU</th>
                   <td class="data last">some sku here i want to get </td> 
                </tr>
            </table>';

   $dom = str_get_html($html); 


   foreach($dom->find('th.label') as $el){
       if($el->plaintext == 'SKU'){  
            echo($el->next_sibling()->plaintext);
       }
   }
于 2013-04-27T22:41:31.580 回答