2013-01-15 30 views
0

我需要向定制CMS中的函数输出的导航HTML添加类。使用php dom操作html导航

我可以得到我需要的输出的唯一方法是用PHP解析HTML。

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

到目前为止,它的工作,但我有2个问题:

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

回答

1
  1. 不是真的。您可以从CakePHP框架中获取XML类,将其转换为数组,操作数组并将其返回。不知道你的情况是否是一种选择。 http://book.cakephp.org/2.0/en/core-utility-libraries/xml.html

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

此外,新的工作不会伤害;)

+0

蛋糕是不是在我的情况选择,但感谢您的建议。事实证明,setAttribute方法创建一个属性,如果它尚不存在。这也节省了一些代码。 – mjr