簡體   English   中英

用php dom操作html導航

[英]manipulate html navigation with php dom

我需要向自定義CMS中的函數輸出的導航HTML添加類。

獲得所需輸出的唯一方法是使用PHP解析HTML。

我正在使用PHP的DOM方法瀏覽HTML,並向包含子<ul>任何<li>元素添加一個類(頂級導航項)。

到目前為止,它正在運行,但是我有兩個問題:

  1. 我有沒有更有效的方法來瀏覽此DOM數據? 對我來說似乎很麻煩,但這可能只是我缺乏經驗。

  2. 在某些情況下,我的<li>元素可能已經有一個類,如何在不破壞可能存在或可能不存在的情況下添加到現有的class屬性中?

--

    <?
        $mcms_nav = getContent(
            // call to cms that returns navigation html as a string
            // ex. <ul id="pnav"><li><a href="/">home</a></li>....</ul>
        );

        $dom = new DOMDocument();
        $dom->preserveWhiteSpace = FALSE;
        $dom->loadHTML($mcms_nav);


        $x = new DOMXPath($dom);
        foreach($x->query('//ul/li/ul') as $node)
        {
            $parent = $node->parentNode;
            $parent_attr = $dom->createAttribute('class');
            $parent_attr->value = 'has-flyout';
            $parent->appendChild($parent_attr);

            $flyout_attr = $dom->createAttribute('class');
            $flyout_attr->value = 'flyout';
            $node->appendChild($flyout_attr);
        }

        $mcms_nav = $dom->getElementByID('pnav');
        echo $dom->saveHTML($mcms_nav);
    ?>
  1. 並不是的。 您可以從CakePHP框架中獲取XML類,將其轉換為數組,操縱該數組,然后將其返回。 不知道這是否是您的選擇。 http://book.cakephp.org/2.0/en/core-utility-libraries/xml.html

  2. 您可以使用dom->hasAttribute()dom->getAttribute()來獲取現有屬性內容(如果存在)。

另外,新工作不會有傷害;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM