SORU
26 EYLÜL 2008, Cuma


Nasıl html php kullanarak ımg src, başlık ve alt ayıklamak için?

Benim web sitesinde bulunan tüm resimlerin başlık ve diğer sunumlar ile listelendiği bir sayfa oluşturmak istiyorum.

Ben zaten beni ve tüm HTML dosyaları bulmak ve yüklemek için küçük bir program yazdım, ama şimdi bu HTML src, title alt ayıklamak için nasıl takıldım:

<img src="/image/fluffybunny.jpg" title="Harvey the bunny" alt="a cute little fluffy bunny" />

Sanırım bu ile bazı düzenli, ama beri sipariş etiketleri değişebilir, ve ben hepsine gerek, bilmiyorum, nasıl bir çözümle bu zarif bir şekilde (ben yapabilirim sabit char ile char şekilde, ama bu acı verici).

CEVAP
27 EYLÜL 2008, CUMARTESİ


Daha iyi biliyorum artık . EDİT :

Bu tür sorunu çözmek için kullanma regexp a bad idea ve büyük olasılıkla unmaintainable ve güvenilmez kodu açacaktır. Daha iyi HTML parser kullanın.

Regexp İle çözüm

Bu durumda daha iki parçaya bölme işlemi için :

  • tüm ımg etiketi
  • onların meta veri ayıklamak

Bir XML çözümleyici kullanabilirsiniz. yani doktor değil xHTML sıkı olduğunu düşünüyorum. E. G. bu web sayfası kaynak kodu :

/* preg_match_all match the regexp in all the $html string and output everything as 
an array in $result. "i" option is used to make it case insensitive */

preg_match_all('/<img[^>] >/i',$html, $result); 

print_r($result);
Array
(
    [0] => Array
        (
            [0] => <img src="/Content/Img/stackoverflow-logo-250.png" width="250" height="70" alt="logo link to homepage" />
            [1] => <img class="vote-up" src="/content/img/vote-arrow-up.png" alt="vote up" title="This was helpful (click again to undo)" />
            [2] => <img class="vote-down" src="/content/img/vote-arrow-down.png" alt="vote down" title="This was not helpful (click again to undo)" />
            [3] => <img src="http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG" height=32 width=32 alt="gravatar image" />
            [4] => <img class="vote-up" src="/content/img/vote-arrow-up.png" alt="vote up" title="This was helpful (click again to undo)" />

[...]
        )

)

Sonra ımg etiketi bir döngü ile tüm öznitelikleri elde ederiz

$img = array();
foreach( $result as $img_tag)
{
    preg_match_all('/(alt|title|src)=("[^"]*")/i',$img_tag, $img[$img_tag]);
}

print_r($img);

Array
(
    [<img src="/Content/Img/stackoverflow-logo-250.png" width="250" height="70" alt="logo link to homepage" />] => Array
        (
            [0] => Array
                (
                    [0] => src="/Content/Img/stackoverflow-logo-250.png"
                    [1] => alt="logo link to homepage"
                )

            [1] => Array
                (
                    [0] => src
                    [1] => alt
                )

            [2] => Array
                (
                    [0] => "/Content/Img/stackoverflow-logo-250.png"
                    [1] => "logo link to homepage"
                )

        )

    [<img class="vote-up" src="/content/img/vote-arrow-up.png" alt="vote up" title="This was helpful (click again to undo)" />] => Array
        (
            [0] => Array
                (
                    [0] => src="/content/img/vote-arrow-up.png"
                    [1] => alt="vote up"
                    [2] => title="This was helpful (click again to undo)"
                )

            [1] => Array
                (
                    [0] => src
                    [1] => alt
                    [2] => title
                )

            [2] => Array
                (
                    [0] => "/content/img/vote-arrow-up.png"
                    [1] => "vote up"
                    [2] => "This was helpful (click again to undo)"
                )

        )

    [<img class="vote-down" src="/content/img/vote-arrow-down.png" alt="vote down" title="This was not helpful (click again to undo)" />] => Array
        (
            [0] => Array
                (
                    [0] => src="/content/img/vote-arrow-down.png"
                    [1] => alt="vote down"
                    [2] => title="This was not helpful (click again to undo)"
                )

            [1] => Array
                (
                    [0] => src
                    [1] => alt
                    [2] => title
                )

            [2] => Array
                (
                    [0] => "/content/img/vote-arrow-down.png"
                    [1] => "vote down"
                    [2] => "This was not helpful (click again to undo)"
                )

        )

    [<img src="http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG" height=32 width=32 alt="gravatar image" />] => Array
        (
            [0] => Array
                (
                    [0] => src="http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG"
                    [1] => alt="gravatar image"
                )

            [1] => Array
                (
                    [0] => src
                    [1] => alt
                )

            [2] => Array
                (
                    [0] => "http://www.gravatar.com/avatar/df299babc56f0a79678e567e87a09c31?s=32&d=identicon&r=PG"
                    [1] => "gravatar image"
                )

        )

   [..]
        )

)

Regexps Bu sayfa önbelleğe isteyebilirsiniz çok CPU yoğun. Eğer herhangi bir önbellek sistemi varsa, bir metin dosyasından ob_start ve yükleme / kaydetme kullanarak kendiniz değiştirebilirsiniz.

Nasıl bu şeyler işe yarıyor mu ?

İlk, preg_ match_ all, Her dize desen eşleştirme ve üçüncü parametrede çıkış alır bir fonksiyon kullanıyoruz.

Bu regexps :

<img[^>] >

Tüm html web sayfaları üzerinde uyguluyoruz. Olarak okunabilirile başlayan her dize "<img",">" ^ ile biten char . sigara içerir.

(alt|title|src)=("[^"]*")

Biz her ımg etiketi üzerinde sırayla uygulayın. Olarak okunabilirher dizesi ile başlayan "alt", "başlık" veya "src", sonra "=",' " ', bir sürü şey değildir '"' ve "ile biter '" '. Arasında alt dizeleri ayırmak ().

Son olarak, regexps, kullanışlı iyi olması için her zaman hızlı bir şekilde onları test etmek için araçlar. Bu online regexp tester kontrol edin.

EDİT : İlk Yorum için cevap.

(Umarım) bir kaç kişi tek tırnak kullanarak hiç düşünmemiştim doğrudur.

Eğer tek kullanıyorsanız iyi, 'tüm"'.

Eğer karıştırın. Kendini tokatla mı: -) o zaman kullanmaya çalışın ( "') | veya "yerine" ve [^ø] yerine [^"].

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Cole Rolland

    Cole Rolland

    23 Kasım 2008
  • LearnKey

    LearnKey

    19 AĞUSTOS 2008
  • Valdorsha

    Valdorsha

    8 Mayıs 2006