setDocument($document); } /** * Set document to query * * @param string $document * @return Zend_Dom_Query */ public function setDocument($document) { if (0 === strlen($document)) { return $this; } if ('setDocumentXml($document); } if (strstr($document, 'DTD XHTML')) { return $this->setDocumentXhtml($document); } return $this->setDocumentHtml($document); } /** * Register HTML document * * @param string $document * @return Zend_Dom_Query */ public function setDocumentHtml($document) { $this->_document = (string) $document; $this->_docType = self::DOC_HTML; return $this; } /** * Register XHTML document * * @param string $document * @return Zend_Dom_Query */ public function setDocumentXhtml($document) { $this->_document = (string) $document; $this->_docType = self::DOC_XHTML; return $this; } /** * Register XML document * * @param string $document * @return Zend_Dom_Query */ public function setDocumentXml($document) { $this->_document = (string) $document; $this->_docType = self::DOC_XML; return $this; } /** * Retrieve current document * * @return string */ public function getDocument() { return $this->_document; } /** * Get document type * * @return string */ public function getDocumentType() { return $this->_docType; } /** * Perform a CSS selector query * * @param string $query * @return Zend_Dom_Query_Result */ public function query($query) { $xpathQuery = Zend_Dom_Query_Css2Xpath::transform($query); return $this->queryXpath($xpathQuery, $query); } /** * Perform an XPath query * * @param string|array $xpathQuery * @param string $query CSS selector query * @return Zend_Dom_Query_Result */ public function queryXpath($xpathQuery, $query = null) { if (null === ($document = $this->getDocument())) { require_once 'Zend/Dom/Exception.php'; throw new Zend_Dom_Exception('Cannot query; no document registered'); } $domDoc = new DOMDocument; $type = $this->getDocumentType(); switch ($type) { case self::DOC_XML: $success = @$domDoc->loadXML($document); break; case self::DOC_HTML: case self::DOC_XHTML: default: $success = @$domDoc->loadHTML($document); break; } if (!$success) { require_once 'Zend/Dom/Exception.php'; throw new Zend_Dom_Exception(sprintf('Error parsing document (type == %s)', $type)); } $nodeList = $this->_getNodeList($domDoc, $xpathQuery); return new Zend_Dom_Query_Result($query, $xpathQuery, $domDoc, $nodeList); } /** * Prepare node list * * @param DOMDocument $document * @param string|array $xpathQuery * @return array */ protected function _getNodeList($document, $xpathQuery) { $xpath = new DOMXPath($document); $xpathQuery = (string) $xpathQuery; if (preg_match_all('|\[contains\((@[a-z0-9_-]+),\s?\' |i', $xpathQuery, $matches)) { foreach ($matches[1] as $attribute) { $queryString = '//*[' . $attribute . ']'; $attributeName = substr($attribute, 1); $nodes = $xpath->query($queryString); foreach ($nodes as $node) { $attr = $node->attributes->getNamedItem($attributeName); $attr->value = ' ' . $attr->value . ' '; } } } return $xpath->query($xpathQuery); } }