0

我需要将类添加到从自定义 CMS 中的函数输出的导航 HTML。

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

我正在使用 PHP 的 DOM 方法来查看 HTML 并向任何<li>包含子元素<ul>(顶级导航项)的元素添加一个类。

到目前为止它正在工作,但我有两个问题:

  1. 有没有更有效的方法让我浏览这些 DOM 数据?这对我来说似乎很麻烦,但这可能只是我缺乏经验。

  2. 在某些情况下,我的<li>元素可能已经有一个类,我怎样才能添加到现有的类属性而不破坏可能已经存在或不存在的内容?

-

    <?
        $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);
    ?>
4

1 回答 1

1
  1. 并不真地。您可以从 CakePHP 框架中获取 XML 类,将其转换为一个数组,操作该数组,然后将其返回。不确定这是否适合您的情况。http://book.cakephp.org/2.0/en/core-utility-libraries/xml.html

  2. 您可以使用dom->hasAttribute()anddom->getAttribute()获取现有的属性内容(如果存在)。

此外,一份新工作也不会受到伤害;)

于 2013-01-15T20:47:37.363 回答