Html kodları ilk görüntü kaynağını ayıklamak için normal ifadeler kullanarak?

10 Cevap php

Ben bu sağlanabilir nasıl bilmek istiyorum.

Varsayın: tabloları içeren html kodu bir çok şey var bu, divs, görüntüler, vs

Sorun: Nasıl tüm olaylarda maçları alabilirsiniz. Daha fazla, (src =?) Ben img kaynağını nasıl alabilirim, belirli olması.

Örnek:

<img src="http://example.com/g.jpg" alt="" />

Nasıl bu durumda http://example.com/g.jpg yazdırabilirsiniz. Ben sözü, ve muhtemelen birden fazla görüntü gibi diğer etiketleri html kodu da var olduğunu varsaymak istiyorum. Bu html kodu tüm görüntüleri kaynaklardan bir dizi olması mümkün olabilir mi?

Ben bu şekilde veya normal ifadelerle başka elde edilebilir biliyorum, ama ben onu asmak alınamıyor.

Herhangi bir yardım büyük beğeni topluyor.

10 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($html){
    require_once('SimpleHTML.class.php')

    $post_html = str_get_html($html);

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

    if($first_img !== null) {
        return $first_img->src';
    }

    return null;
}

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 de alt özniteliği alabilirsiniz.

Bir düzenli ifade aynı hedefe ulaşmak için tasarlanmış olabilir ama zorlayacaktır ki bu şekilde sınırlı olacaktır alt 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.


EDIT: tüm görüntüleri istiyorsanız:

function get_images($html){
    require_once('SimpleHTML.class.php')

    $post_dom = str_get_dom($html);

    $img_tags = $post_dom->find('img');

    $images = array();

    foreach($img_tags as $image) {
        $images[] = $image->src;
    }

    return $images;
}

Bunu kullanın, daha etkilidir:

preg_match_all('/<img [^>]*src=["|\']([^"|\']+)/i', $html, $matches);
foreach ($matches[1] as $key=>$value) {
    echo $value."<br>";
}

Örnek:

$html = '
<ul>     
  <li><a target="_new" href="http://www.manfromuranus.com">Man from Uranus</a></li>       
  <li><a target="_new" href="http://www.thevichygovernment.com/">The Vichy Government</a></li>      
  <li><a target="_new" href="http://www.cambridgepoetry.org/">Cambridge Poetry</a></li>      
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value1.jpg" />
  <li><a href="http://www.verot.net/pretty/">Electronaut Records</a></li>      
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value2.jpg" />
  <li><a target="_new" href="http://www.catseye-crew.com">Catseye Productions</a></li>     
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value3.jpg" />
</ul>
<img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="res/upload.jpg" />
  <li><a target="_new" href="http://www.manfromuranus.com">Man from Uranus</a></li>       
  <li><a target="_new" href="http://www.thevichygovernment.com/">The Vichy Government</a></li>      
  <li><a target="_new" href="http://www.cambridgepoetry.org/">Cambridge Poetry</a></li>      
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value4.jpg" />
  <li><a href="http://www.verot.net/pretty/">Electronaut Records</a></li>      
  <img src="value5.jpg" />
  <li><a target="_new" href="http://www.catseye-crew.com">Catseye Productions</a></li>     
  <img width="190" height="197" border="0" align="right" alt="upload.jpg" title="upload.jpg" class="noborder" src="value6.jpg" />
';   
preg_match_all('/<img .*src=["|\']([^"|\']+)/i', $html, $matches);
foreach ($matches[1] as $key=>$value) {
    echo $value."<br>";
}

Çıktı:

value1.jpg
value2.jpg
value3.jpg
res/upload.jpg
value4.jpg
value5.jpg
value6.jpg

Bu benim için çalışıyor:

preg_match('@<img.+src="(.*)".*>@Uims', $html, $matches);
$src = $matches[1];

i tüm src = var "url etrafında varsayalım

<img[^>]+src=\"([^\"]+)\"

burada yayınlanan diğer cevaplar kodu hakkında diğer assumsions yapmak

Andrew Moore katılıyorum. DOM kullanarak çok daha iyidir. HTML DOM görüntüleri koleksiyonu sizin için tüm görüntü nesnelere başvuru dönecektir.

Diyelim ki var senin başlığında diyelim,

<script type="text/javascript">
    function getFirstImageSource()
    {
        var img = document.images[0].src;
        return img;
    }
</script>

ve daha sonra vücudunuzda var,

<script type="text/javascript">
  alert(getFirstImageSource());
</script>

Bu 1. görüntü kaynağını dönecektir. (Head bölümünde), çizgisinde onlar aracılığıyla da yapabilirsiniz döngü

function getAllImageSources()
    {
        var returnString = "";
        for (var i = 0; i < document.images.length; i++)
        {
            returnString += document.images[i].src + "\n"
        }
        return returnString;
    }

(Vücuttaki)

<script type="text/javascript">
  alert(getAllImageSources());
</script>

Bunu yapmak için JavaScript kullanıyorsanız, size fonksiyon başlığında görüntüleri koleksiyonu döngü koşamam unutmayın. Diğer bir deyişle, böyle bir şey yapamaz,

<script type="text/javascript">
    function getFirstImageSource()
    {
        var img = document.images[0].src;
        return img;
    }
    window.onload = getFirstImageSource;  //bad function

</script>

Bu işe yaramaz çünkü. Başlık yürütüldüğünde görüntüleri yüklü değil ve böylece boş bir sonuç alırsınız.

Umarım bu bir şekilde yardımcı olabilir. Mümkünse, ben DOM faydalanmak istiyorum. Siz işinizi iyi bir anlaşma zaten sizin için yapılır göreceksiniz.

Eğer sonuç almak için regex kullanmak gerekir, ben bilmiyorum. Eğer değilse, çok daha güvenilir hedef için olacağını, SimpleXML ve XPath'i deneyebilirsiniz:

İlk olarak, bir DOM Document Object içine HTML alma. Eğer hata alırsanız, bu bölümü için hataları kapatmak ve sonra onları geri çevirmek için emin olun:

 $dom = new DOMDocument();
 $dom -> loadHTMLFile("filename.html");

Sonra, şöyle bir SimpleXMLElement nesnesine DOM ithalat:

 $xml = simplexml_import_dom($dom);

Şimdi bir diziye görüntü elemanları (ve özellikleri) tüm almak için birkaç yöntem kullanabilirsiniz. XPath onunla DOM geçme ile daha şanslıyım çünkü, tercih biridir:

 $images = $xml -> xpath('//img/@src');

Bu değişken şimdi resim URL'leri bir dizi gibi tedavi edebilirsiniz:

 foreach($images as $image) {
    echo '<img src="$image" /><br />
    ';
  }

Presto, tüm görüntüleri, yağ hiçbiri.

İşte yukarıda olmayan açıklamalı versiyonu:


 $dom = new DOMDocument();
 $dom -> loadHTMLFile("filename.html");

 $xml = simplexml_import_dom($dom);

 $images = $xml -> xpath('//img/@src');

 foreach($images as $image) {
    echo '<img src="$image" /><br />
    ';
  }

Gerçekten düzenli ifade ile tüm durumlarda tahmin edemez düşünüyorum.

En iyi yolu, PHP5 class DOMDocument ve XPath ile DOM kullanmaktır. Bu ne istediğinizi yapmak için temiz yoldur.

$dom = new DOMDocument();
$dom->loadHTML( $htmlContent );
$xml = simplexml_import_dom($dom);
$images = $xml -> xpath('//img/@src');

Bu deneyebilirsiniz:

preg_match_all("/<img\s+src=\"(.+)\"/i", $html, $matches);
foreach ($matches as $key=>$value) {
    echo $key . ", " . $value . "<br>";
}

Eğer HTML doğrulama endişesi değil çünkü, sen cruft çoğunu temizlemek için ilk metin üzerinde strip_tags() kullanarak deneyebilirsiniz.

Sonra gibi bir ifade için arama yapabilirsiniz

"/\<img .+ \/\>/i"

The backslashes escape special characters like <,>,/. .+ insists that there be 1 or more of any character inside the img tag You can capture part of the expression by putting parentheses around it. e.g. (.+) captures the middle part of the img tag.

Eğer yakalamak için özel isteyen ortasında hangi bölümünün karar verdiğinizde, size daha özel bir şey için (. +) Değiştirebilirsiniz.

<?php    
/* PHP Simple HTML DOM Parser @ http://simplehtmldom.sourceforge.net */

require_once('simple_html_dom.php');

$html = file_get_html('http://example.com');
$image = $html->find('img')[0]->src;

echo "<img src='{$image}'/>"; // BOOM!

PHP Basit HTML DOM Parser kod birkaç satır içinde iş yapacak.