Php: dizesinde ilk img veya nesne etiketi bul

2 Cevap php
  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;
    }

beyler merhaba, ben sadece bu kodda yapıyorum hata ne olabilir sormak istedim. i anda bir resim etiketi ilk görüldüğü bulmaya çalışıyorum ya da bir eşleşirse bir nesne etiketi sonra html bir parça döner. i anda resim etiketi doğru yapabilirler. ama ne yazık ki ben bir nesne etiketi üzerinde herhangi bir sonuç var gibi olamaz. benim regex desen falan belki orada bazı hata düşünüyorum. Siz bana yardımcı olabilir? i yeterince açık teşekkürlerini anlamak için yapılan umuyoruz.

2 Cevap

Düzenli ifadeler görevleri büyük bir çeşitlilik için iyi olabilir, ben HTML DOM ayrıştırma zaman genellikle kısa düşüyor bulabilirsiniz. HTML ile sorun belgenizin yapısı doğru (ve doğru ile ben hiç yanlış pozitif ile% 100 başarı oranı ortalama) bir etiket ayıklamak için zor olduğu kadar değişken olmasıdır.

Ne yapmanız tavsiye gibi SimpleHTML gibi bir DOM ayrıştırıcı kullanmak ve bu şekilde kullanmaktır:

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>';
}

Bazıları bu overkill olduğunu düşünüyorum, ama sonunda, onu korumak için daha kolay olacak ve aynı zamanda daha fazla genişletilebilirlik için izin verir. Örneğin, DOM çözümleyici kullanarak, ben mevcut görüntü stilleri ekleyebilirsiniz.

Bir düzenli ifade aynı hedefe ulaşmak için tasarlanmış olabilir ama zorlayacaktır ki bu şekilde sınırlı olacaktır style src ya da tam tersi sonra olmak nitelik ve bu üstesinden gelmek için sınırlama normal ifadeye daha fazla karmaşıklık eklersiniz.

Ayrıca, aşağıdakileri dikkate alın. Düzgün düzenli ifadeler kullanarak bir <img> etiketini eşleştirmek için ve (grup 2 yakalanan) sadece src niteliğini almak için, şu normal ifadeyi gerekir:

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

Ve sonra yine, yukarıdaki eğer başarısız olabilir:

  • Niteliği veya etiket adı sermaye ve i değiştirici kullanılmaz.
  • Tırnaklar src niteliği etrafında kullanılmaz.
  • Bir başka özellik daha sonra src yerde onların değer > karakteri kullanır.
  • Ben öngörülen bazı başka nedenidir.

Yani yine, sadece bir dom belgeyi ayrıştırmak için normal ifadeler kullanmayın.

Bu deneyin: (Sen maçı dizideki almak istediğinizi tanımlamak gerekir)

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;
    }