2010-10-30 16 views
5

प्रत्येक के नीचे दो विधियां एक ही उद्देश्य प्रदान करती हैं: पोस्ट की सामग्री को स्कैन करें और निर्धारित करें कि कम से कम एक आईएमजी टैग में एक alt विशेषता है जिसमें "कीवर्ड" है जिसका परीक्षण किया जा रहा है।एक्सपैथ या रेगेक्स का प्रयोग करें?

मैं xPath के लिए नया हूँ और यह कैसे महंगा है कि दृष्टिकोण regex संस्करण की तुलना में है पर निर्भर करता है का उपयोग करना पसंद करेंगे ...

विधि # 1 preg_match का उपयोग करता

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 का उपयोग करता है xPath

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" का उपयोग करना सबसे अच्छा है? मुझे लगता है कि आपके पास एक टाइपो है। –

+0

धन्यवाद, टाइपो को ठीक किया गया और xPath –

उत्तर

14

आप XML आप XPath का उपयोग करना चाहिए के रूप में यह वास्तव में इस उद्देश्य के लिए डिजाइन किया गया था पार्स करने रहे हैं। एक्सएमएल/एक्सएचटीएमएल नियमित भाषा नहीं है और नियमित अभिव्यक्तियों द्वारा सही ढंग से पार्स नहीं किया जा सकता है। आप एक नियमित अभिव्यक्ति लिखने में सक्षम हो सकते हैं जो कुछ समय काम करता है लेकिन विशेष मामले होंगे जहां यह असफल हो जाएगा।

+3

संपादित किया गया "XPath का उपयोग XML दस्तावेज़ में तत्वों और विशेषताओं के माध्यम से नेविगेट करने के लिए किया जाता है।" घोड़ों के मुंह से (डब्ल्यू 3 सी)। –

+2

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

+0

+1 एक्सएमएल पर regex का उपयोग करते हुए एक पेचकश का उपयोग कर एक में कटौती करने की तरह है पेड़। एक्सएमएल पर एक्सपीएथ का उपयोग पेड़ को काटने के लिए चेनसॉ का उपयोग करना है। दोनों उपयोगी हैं, लेकिन न तो दूसरे को प्रतिस्थापित कर सकते हैं। एक अच्छे उत्तर के लिए – delnan

4

किसी XML दस्तावेज़ में नोड्स का चयन करने के लिए RegEx का उपयोग करना उतना ही उचित है जितना कि दिया गया नंबर एक प्राइम है या नहीं।

तथ्य यह है कि this is possible यह भी एक सा उचित नहीं है।

और क्या है, XPath 2.0 has RegEx support जबकि RegEx में XPath समर्थन नहीं है। इसलिए, यदि दोनों की आवश्यकता है, तो शायद XPath 2.0

+0

* (sidenote) * ओपी का उदाहरण कोड एक PHP वातावरण का सुझाव देता है। PHP का डॉम एक्सटेंशन libxml का उपयोग करता है। libxml XPath 2.0 का समर्थन नहीं करता है। लेकिन PHP के डीओएम एक्सटेंशन नियमित अभिव्यक्तियों सहित XPath के अंदर किसी भी PHP फ़ंक्शन का उपयोग करने का समर्थन करता है। इसलिए जब आपका उत्तर किसी भाषा अज्ञेय पीओवी से बिल्कुल सही है, तो उसे PHP के DOMXPath कार्यान्वयन को RegEx समर्थन में पढ़ना होगा। यह अभी भी पाठ्यक्रम के एक ही निष्कर्ष की ओर जाता है :) – Gordon

+0

@ गॉर्डन, वह एक्सएसएलटी 1.0 का उपयोग कर सकते हैं –

संबंधित मुद्दे