2009-07-24 3 views
1

私はこのコードで何をしているのか尋ねたい。 私は現在、イメージタグまたはオブジェクトタグの最初のオカレンスを見つけようとしています。そして、それが一致する場合、HTMLの一部を返します。 現在、画像タグを取得できますが、残念ながらオブジェクトタグの結果は表示されません。PHP:文字列内の最初のimgタグまたはobjectタグを見つける

私は思っています、私は正規表現のパターンなどでいくつかの間違いをしています。希望の要件はあなたが感謝を理解するために十分明確です。ここ

マイコード:

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

+0

ああ...スクロールバーのために表示されませんでした。おもしろい... –

+0

あなたは戻ってくるものを決して定義しません。マッチする配列の中に '(' ')を置く必要があります。 –

3

を(あなたがマッチ配列で取得したいものを定義する必要があります)タスクのうち、私はそれが通常、HTML DOMを解析するときに不足することがわかります。 HTMLの問題は、文書の構造が可変であり、正確には難しい(正確には、偽陽性のない100%の成功率を意味する)タグを抽出することです。私はあなたがお勧め何

は、SimpleHTMLとしてDOMパーサーを使用し、そのように使用している:

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>タグに一致するようにして(グループ2でキャプチャ)のみsrc属性を取得するには、次の正規表現が必要です。

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

そしてを再び、上記の場合に失敗することができます

  • 属性またはタグ名が大文字で、修飾子が使用されていません。i
  • src属性の周囲には引用符は使用されていません。
  • もう1つの属性srcは、その値のどこかに>文字を使用します。
  • 私は予見していないいくつかの他の理由。

再び、正規表現を使用してdomドキュメントを解析しないでください。

関連する問題