<?php 
 
class CSSHelper { 
     
    /** 
     * Gets the previous sibling DOMElement object. 
     * @param DOMNode $node 
     * @return NULL|DOMElement 
     */ 
    public static function getPreviousSiblingElement($node) { 
        do { 
            $node = $node->previousSibling; 
        } while ($node && !($node instanceof DOMElement)); 
        return $node; 
    } 
     
    /** 
     * Gets the next sibling DOMElement object. 
     * @param DOMNode $node 
     * @return NULL|DOMElement 
     */ 
    public static function getNextSiblingElement($node) { 
        do { 
            $node = $node->nextSibling; 
        } while ($node && !($node instanceof DOMElement)); 
        return $node; 
    } 
     
    public static function getChildElements($node) { 
        $ret = array(); 
        $nodes = $node->childNodes; 
        foreach ($nodes as $node) { 
            if ($node instanceof DOMElement) { 
                array_push($ret, $node); 
            } 
        } 
        return $ret; 
    } 
     
    /** 
     * Gets elements by tagname. 
     * @param DOMElement $node 
     * @param string $tag_name 
     * @return array(DOMElement, ...) 
     */ 
    public static function getElementsByTagName($node, $tag_name) { 
        $ret = array(); 
        $nodes = $node->getElementsByTagName($tag_name); 
        foreach ($nodes as $node) { 
            if ($node instanceof DOMElement) { 
                array_push($ret, $node); 
            } 
        } 
        return $ret; 
    } 
     
    /** 
     * Is the node in the given list? 
     * @param DOMNode $node 
     * @param array(DOMNode, ...) $items 
     * @return boolean 
     */ 
    public static function isNodeInList($node, $items, $offset = 0) { 
        $len = count($items); 
        for ($i = $offset; $i < $len; $i++) { 
            $item = $items[$i]; 
            if ($item->isSameNode($node)) { 
                return TRUE; 
            } 
        } 
        return FALSE; 
    } 
     
    /** 
     * Merge two lists of nodes without repeating nodes. 
     * @param array(DOMNode, ...) $nodes1 
     * @param array(DOMNode, ...) $nodes2 
     * @return array(DOMNode, ...) 
     */ 
    public static function mergeNodes($items1, $items2) { 
        $ret = array(); 
        $items = array_merge($items1, $items2); 
        $len = count($items); 
         
        for ($i = 0; $i < $len; $i++) { 
            $item = $items[$i]; 
            if (!CSSHelper::isNodeInList($item, $items, $i + 1)) { 
                array_push($ret, $item); 
            } 
        } 
        return $ret; 
    } 
     
    /** 
     * Gets the string representation of a DOMNode object. 
     * @param DOMNode $node 
     * @return string 
     */ 
    public static function dom2str($node) { 
        $doc = $node instanceof DOMDocument? $node : $node->ownerDocument; 
        return $doc->saveXML($node); 
    } 
     
    /** 
     * Gets the nodes from a css selector expression. 
     * This function simplifies the use of CSSParser. 
     * @param DOMNode $node 
     * @param string $query A CSS selector expression. 
     * @return array(DOMElement, ...) 
     */ 
    public static function select($node, $query) { 
        $nodes = array(); 
        $p = new CSSParser($node, $query); 
        $nodes = $p->parse(); 
        return $nodes; 
    } 
} 
 
 |