2009-07-24 41 views
1

我想問一下我在這段代碼中犯的錯誤。 我目前正在嘗試查找圖像標記或對象標記的第一個匹配項,然後返回一段html,如果它匹配一個。 目前,我可以獲取圖片標籤,但不幸的是,我似乎無法在對象標籤上獲得任何結果。PHP:查找字符串中的第一個img或對象標記

我認爲,我在我的正則表達式模式或某事中犯了一些錯誤。希望的要求已經足夠清楚,你可以理解謝謝。

我在這裏的代碼:

function get_first_image(){ 
     global $post, $posts; 
     $first_img = ''; 
     ob_start(); 
     ob_end_clean(); 
     $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches) || preg_match_all('/<object[0-9 a-z_?*=\":\-\/\.#\,<>\\n\\r\\t]+<\/object>/smi', $post->post_content, $matches); 
     $first_img = $matches [1] [0]; 

     if(empty($first_img)){ //Defines a default image 
     $mediaSearch = preg_match_all('/<object[0-9 a-z_?*=\":\-\/\.#\,<>\\n\\r\\t]+<\/object>/smi', $post->post_content, $matches2); 
     $first_media = $matches2 [1] [0]; 
     $first_img = "/images/default.jpg"; 
     } 

     if(!empty($first_img)){ 
     $result = "<div class=\"alignleft\"><img src=\"$first_img\" style=\"max-width: 200px;\" /></div>"; 
     } 

     if(!empty($first_media)){ 
     $result = "<p>" . $first_media . "</p>"; 
     } 

     return $result; 
    } 

回答

2

試試這個:(您需要定義你想要的比賽陣中得到什麼)

function get_first_image(){ 
     global $post, $posts; 
     $first_img = ''; 
     ob_start(); 
     ob_end_clean(); 
     $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*>/i', $post->post_content, $matches) || preg_match_all('(/<object[0-9 a-z_?*=\":\-\/\.#\,<>\\n\\r\\t]+<\/object>)/smi', $post->post_content, $matches); 
     $first_img = $matches [1] [0]; 

     if(empty($first_img)){ //Defines a default image 
     $mediaSearch = preg_match_all('/<object[0-9 a-z_?*=\":\-\/\.#\,<>\\n\\r\\t]+<\/object>/smi', $post->post_content, $matches2); 
     $first_media = $matches2 [1] [0]; 
     $first_img = "/images/default.jpg"; 
     } 

     if(!empty($first_img)){ 
     $result = "<div class=\"alignleft\"><img src=\"$first_img\" style=\"max-width: 200px;\" /></div>"; 
     } 

     if(!empty($first_media)){ 
     $result = "<p>" . $first_media . "</p>"; 
     } 

     return $result; 
    } 
+0

好吧,我目前正在嘗試使該功能還搜索對象標籤... – user143805 2009-07-24 05:28:54

3

雖然正則表達式可以很好的爲種類繁多的任務,我發現它通常在解析HTML DOM時不夠用。 HTML的問題在於,您的文檔結構變化太大,以至於很難準確(並且準確地說,我的意思是100%的成功率,並且沒有誤報)提取標籤。

我建議你做什麼是使用DOM解析器如SimpleHTML,並用它作爲這樣的:

function get_first_image(){ 
    global $post, $posts; 

    require_once('SimpleHTML.class.php') 

    $post_dom = str_get_dom($post->post_content); 

    $first_img = $post_dom->find('img', 0); 

    if($first_img !== null) { 
     $first_img->style = $first_img->style . ';max-width: 200px'; 
     return '<div class="alignleft">' . $first_img->outertext . '</div>'; 
    } else { 
     $first_obj = $post_dom->find('object', 0); 

     if($first_obj !== null) { 
      return '<p>' . $first_obj->outertext . '</p>'; 
     } 
    } 

    return '<div class="alignleft"><img src="/images/default.jpg" style="max-width: 200px;" /></div>'; 
} 

有些人可能認爲這是矯枉過正,但最終,它會更容易維護,也允許更多的可擴展性。例如,使用DOM解析器,我可以添加到當前圖像的樣式。

可以設計一個正則表達式來實現相同的目標,但會受到限制,它會強制style屬性位於src之後或相反,並且克服此限制會增加常規表達。

另外,請考慮以下事項。要使用正則表達式正確匹配<img>標籤,並只得到src屬性(第2組拍攝的),你需要以下的正則表達式:

<\s*?img\s+?[^>]*?\s*?src\s*?=\s*?(["'])((\\?+.)*?)\1[^>]*?> 

再然後,上面都可能失敗:

  • 該屬性或標記名稱是大寫,並且i修飾符未使用。
  • src屬性周圍不使用引號。
  • 另一個屬性,然後src使用>字符的價值。
  • 我沒有預見到的其他一些原因。

所以再說一遍,根本就不用正則表達式來解析一個dom文件。

相關問題