Değil başka Ayrıştırma-HTML-ile-Regex Soru

5 Cevap php

Ben burada yeniden ayrıştırma HTML regex ile bir kaç soru okudum, ve ben bu bütün çok kötü bir fikir olduğunu anlıyorum.

Bunu söyledikten sonra, ben think Regex için cevap olabilir çok özel bir sorun var. Ben cevabını bulmaya çalışıyorum beceriksiz oldum ama Regex için (bugün) yeni değilim, ve bazı tür yürekli bir kişi bana yardımcı mümkün olabilir umuyordum.

Ben her zaman biçimi takip dizelerden oluşan bir dizi var

STUFF HERE<a href="somewhere" title="something" target="_blank">name of thing</a>STUFF HERE

Ne elde etmek umuyorum, sadece 'yer' ve şey 'isminle üzere olduğunu bu yüzden olabilir çıkış sadece <a href="somewhere">name of thing</a>.

Eğer ilginizi ne varsa dizeler dizisi, benim Facebook profilinizde bağlantıların bir RSS beslemesi geliyor.

Herhangi bir yardım için çok, çok teşekkürler.

Kriko

5 Cevap

$str = 'STUFF HERE<a href="somewhere" title"something" target="_blank">name of thing</a>STUFF HERE';
$success = preg_match('/.*href=\"([^\"]+)\".*>([^<]+)<.*/i', $str, $matches);
if ($success) {
    echo $matches[1];
    echo $matches[2];
} else {
    echo "Parsing failed.";
}

Parantez hükümler $ maçlar dizi için maç bölümlerini izole. Desen hiç dize eşleşirse, o zaman $ maçı [1] href içerecek ve $ maçı [2] link metnini içerecektir.

Parantez içinde, ben dışlama karakterleri ile ilgileniyorsanız bu segmentlerin eti tanımlayan ediyorum. İlki çift tırnak dışında herhangi bir karakterin bir-veya-daha [^ \ "] + vardır. Ikincisi [^ <] +, daha az dışında bir ya da herhangi bir karakterin daha hangi. Bu sayede bu ilgilendiğiniz kısımlarının her iki tarafında işaretleme sağlanan formatta sürekli ise, o zaman iyi tanımlanmış sınırlar

Eğer pragmatizm ölçekte gelen nereye ben tamamen anlıyorum.

Ancak PHP çok nice/straightforward HTML parser var, ve ben not bunu tavsiye tereddüt ediyorum bu işe almak için yeterince basit görünüyor.

Ben PHP bilmiyorum, ama regex (son derece kırılgan) aşağıdakileri kullanabilirsiniz:

<a href="(.+?)" title=".+?" target="_blank">(.+?)</a>

Bu URL'yi ve bağlantının metnini yakalayacaktır.

Eğer biraz daha esnek olmasını istiyorsanız, bu gibi herhangi bir özelliklerini, izin verebilir:

<a .*?href="(.+?)".*?>(.+?)</a>

SLaks regex may href, burada almak benim başka hiçbir nitelikleri ile URL'ler ile bazı sorunları var:

~<a.+?href="(.+?)".*?>(.+?)</a>~i

Ben kendi Facebook yem ile test ettik ve SimpleXML ile yük olabilir. Evet, kısmen. RSS beslemesi doğrudan yüklenen olamaz, ama ilk saksağan ile Yem getirme eğer, o zaman bu gibi SimpleXML ile açıklama elemanı yükleyebilirsiniz:

$xml = simplexml_load_string($description); // load description
$link = $xml->xpath('//a');                 // find all links inside
$href = (string) $link[0]['href'];          // get URL
$text = (string) $link[0];                  // and link text

Sürece Facebook açıklaması içindeki HTML sonu yok gibi, SimpleXML kullanımı güvenlidir. Bunu kırmak ise, SimpleXML şikayet edecektir.