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
                }
            }

クラス ラベルと 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 に答える