2010-10-30 24 views
5

Los dos métodos que figuran a continuación tienen el mismo objetivo: escanear el contenido de la publicación y determinar si al menos una etiqueta img tiene un atributo alt que contiene la "palabra clave" que se está probando.¿Utiliza xPath o Regex?

Soy nuevo en XPath y preferiría usarlo en función de lo caro que el enfoque se compara con la versión de expresiones regulares ...

Método # 1 utiliza preg_match Método

function image_alt_text_has_keyword($post) 
     { 
      $theKeyword = trim(wpe_getKeyword($post)); 
      $theContent = $post->post_content; 
      $myArrayVar = array(); 
      preg_match_all('/<img\s[^>]*alt=\"([^\"]*)\"[^>]*>/siU',$theContent,$myArrayVar); 
      foreach ($myArrayVar[1] as $theValue) 
      { 
       if (keyword_in_content($theKeyword,$theValue)) return true; 
      } 
      return false; 
     } 

function keyword_in_content($theKeyword, $theContent) 
     { 
      return preg_match('/\b' . $theKeyword . '\b/i', $theContent); 
     } 

# 2 utiliza xRuta

function keyword_in_img_alt() 
{ 
global $post; 
$keyword = trim(strtolower(wpe_getKeyword($post))); 
$dom = new DOMDocument; 
$dom->loadHTML(strtolower($post->post_content)); 
$xPath = new DOMXPath($dom); 
return $xPath->evaluate('count(//a[.//img[contains(@alt, "'.$keyword.'")]])'); 
} 
+0

"constains"? Creo que tienes un error tipográfico. –

+0

Gracias, corrigió el error ortográfico y editó xPath –

Respuesta

14

Si el análisis de XML que debe utilizar XPath ya que fue diseñado exactamente para este propósito. XML/XHTML no es un lenguaje regular y no puede ser analizado correctamente por expresiones regulares. Es posible que pueda escribir una expresión regular que funcione algunas veces, pero habrá casos especiales en los que fallará.

+3

"XPath se usa para navegar a través de elementos y atributos en un documento XML". Desde la boca de los caballos (W3C). –

+2

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 –

+0

+1 Usar regex en XML es como usar un destornillador para cortar un árbol. Usar XPath en XML es como usar una motosierra para cortar el árbol. Ambos son útiles, pero ninguno puede reemplazar al otro. – delnan

4

El uso de RegEx para seleccionar nodos en un documento XML es tan apropiado como usarlo para encontrar si un número determinado es primo.

El hecho de que this is possible no lo hace ni siquiera un poco apropiado.

Además, XPath 2.0 has RegEx support mientras que RegEx no tiene soporte para XPath. Por lo tanto, si ambos son necesarios, probablemente sea mejor utilizar XPath 2.0

+0

* (nota al margen) * El código de ejemplo del OP sugiere un entorno PHP. La extensión DOM de PHP usa libxml. libxml no es compatible con XPath 2.0. Pero la extensión DOM de PHP admite el uso de cualquier función de PHP dentro de XPath, incluidas las expresiones regulares. Entonces, si bien su respuesta es perfectamente correcta desde un POV independiente del idioma, debería leer que la implementación DOMXPath de PHP tiene soporte para RegEx. Eso todavía lleva a la misma conclusión, por supuesto :) – Gordon

+0

@Gordon, él puede usar XSLT 1.0 –

Cuestiones relacionadas