2010-10-30 39 views
5

Hai phương pháp bên dưới mỗi mục đích sử dụng cùng một mục đích: quét nội dung của bài đăng và xác định xem có ít nhất một thẻ img có thuộc tính alt chứa "từ khóa" đang được thử nghiệm không.Sử dụng xPath hoặc Regex?

Tôi mới đến xPath và muốn sử dụng nó tùy thuộc vào cách tiếp cận tốn kém mà được so sánh với phiên bản regex ...

Phương pháp # 1 sử dụng 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); 
     } 

Phương pháp # 2 sử dụng 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"? Tôi nghĩ bạn có lỗi đánh máy. –

+0

Cảm ơn, sửa lỗi đánh máy và chỉnh sửa XPath xPath –

Trả lời

14

Nếu bạn phân tích cú pháp XML, bạn nên sử dụng XPath vì nó được thiết kế chính xác cho mục đích này. XML/XHTML không phải là ngôn ngữ thông thường và không thể được phân tích cú pháp chính xác bằng các cụm từ thông dụng. Bạn có thể viết một biểu thức chính quy, nó hoạt động trong một khoảng thời gian nhưng sẽ có những trường hợp đặc biệt mà nó sẽ thất bại.

+3

"" được sử dụng để điều hướng qua các phần tử và các thuộc tính trong một tài liệu XML. " Từ miệng ngựa (W3C). –

+2

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

+0

+1 Sử dụng regex trên XML giống như sử dụng một tuốc nơ vít để cắt giảm cây. Sử dụng XPath trên XML giống như sử dụng một cưa để cắt cây xuống. Cả hai đều hữu ích, nhưng không thể thay thế được. – delnan

4

Sử dụng RegEx để chọn các nút trong tài liệu XML là thích hợp khi sử dụng nó để tìm kiếm nếu một số đã cho là số nguyên tố.

Thực tế là this is possible không làm cho nó thậm chí thích hợp một chút.

Hơn nữa, XPath 2.0 has RegEx support trong khi RegEx không có hỗ trợ XPath. Do đó, nếu cả hai đều cần thiết, tốt nhất có thể sử dụng XPath 2.0

+0

* (sidenote) * Mã ví dụ của OP gợi ý một môi trường PHP. Phần mở rộng DOM của PHP sử dụng libxml. libxml không hỗ trợ XPath 2.0. Tuy nhiên, phần mở rộng DOM của PHP hỗ trợ sử dụng bất kỳ hàm PHP nào bên trong XPath, bao gồm các biểu thức chính quy. Vì vậy, trong khi câu trả lời của bạn là hoàn toàn chính xác từ một POV bất khả tri về ngôn ngữ, nó sẽ phải đọc thực thi DOMXPath của PHP có hỗ trợ RegEx. Điều đó vẫn dẫn đến cùng một kết luận của khóa học :) – Gordon

+0

@Gordon, anh ấy có thể sử dụng XSLT 1.0 –