Ben HTML img src balık için kullanmak neden bu regex hataları dönüyor?

4 Cevap php

Ben bir html dosyasında bulduğu ilk görüntü etiketi src dışarı balıklar bir fonksiyon yazıyorum. this thread burada, ben çalışıyor gibiydi bir şey var yönergeleri izleyerek:

preg_match_all('#<img[^>]*>#i', $content, $match); 

foreach ($match as $value) {
    $img = $value[0];
                           } 

$stuff = simplexml_load_string($img);
$stuff = $stuff[src];
return $stuff;

Ancak işlevini kullanarak bir kaç dakika sonra, bu gibi hataları dönen başladı:

Uyarı: simplexml_load_string () [0function.simplexml-yük-string0]: Varlık: line 1: ayrıştırıcı hatası: / için / komut satırında 42 yolu etiketi img hat 1 veri sonu.

ve

Uyarı: simplexml_load_string () [0function.simplexml-yük-string0]:? tp :/ / feeds.feedburner.com / ~ ChicagobusinesscomBreakingNews / i = KiStN "border =" 0 "> f yolu / için / 42, satırında komut dosyası.

Ben tür yeni PHP değilim ama benim regex yanlış HTML kıyma olduğu gibi görünüyor. Nasıl daha fazla "hava geçirmez" yapabilir?

4 Cevap

PHP kod Bu iki satır bir HTML dosyasında tüm img etiketleri src niteliği bütün değerlerin bir listesini vermelidir:

preg_match_all('/<img\s+[^<>]*src=["\']?([^"\'<>\s]+)["\']?/i', $content, $result, PREG_PATTERN_ORDER);
$result = $result[1];

Regex basit tutmak için, ben dosya adları bunları boşluklar için izin değilim. Buna izin vermek istiyorsanız, alıntı nitelik değerleri için ayrı alternatifler (boşluk olabilir ki), ve (boşluk olamaz) tırnaksız nitelik değerleri kullanmanız gerekir.

Regex tarafından alınıyor "XML" sebebi ne olursa olsun doğru XML değil, çünkü büyük olasılıkla. Herhalde yerine src almak için SimpleXML kullanarak, src niteliğini çekeceği daha karmaşık bir regex için giderdim. Bu REGEX neye ihtiyacınız yakın olabilir.

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

Ayrıca bir gerçek HTML Ayrıştırma kütüphane kullanabilirsiniz, ama ben PHP var olan seçenekleri emin değilim.

Bir öznitelik kendisi tarafından bir ve işareti (it "&" olarak kodlanmış olmalıdır), ama bazı insanlar hala HTML sayfalarında URL'ler bu şekilde koymak (ve tüm tarayıcılar destek) geçersiz XML. Belki sorun yatıyor.

Bu durum ise, "&amp;" "&(?!amp;)" tarafından yerine, ayrıştırma önce dize sterilize edebilirsiniz.

Farklı bir konuda:

foreach ($match as $value) {
    $img = $value[0];
                           }

ile değiştirilebilir

$img = $match[count($match) - 1][0];

Böyle bir şey:

if (preg_match('#<img\s[^>]*>#i', $content, $match)) {
    $img = $match[0]; //first image in file only
    $stuff = simplexml_load_string($img);
    $stuff = $stuff[src];
    return $stuff;
} else {
    return null; //no match found
}