preg_replace cehennem

2 Cevap php

Ben uzak bir sayfadan bazı verileri almak için preg_replace kullanmaya çalışıyorum, ancak desen sıralama gelince ben bir sorun biraz yaşıyorum.

function getData($Url){
    $str = file_get_contents($Url);
    if(strlen($str)>0){
        preg_match("/\<span class=\"SectionHeader\"\>title\</span>/<br/>/\<div class=\"header2\"\>(.*)\</div\></span\>/",$str,$title);
        return $title[1];
    }
}

Ben ona bir milyon bölü (Ben bir kısmını ya da iki unuttum gibi görünüyor) atma sona erdi önce olduğu gibi burada HTML bulunuyor:

<span class="cell CellFullWidth"><span class="SectionHeader">mytitle</span><br/><div class="Center">Event Name</div></span>

Event Name benim işlevi dönmek istiyorum veri olduğu.

Çok teşekkürler çocuklar, bu eşek bir ağrı.

2 Cevap

Ben bu güzel çözüm olmadığını commenters katılıyorum eğimli iken, burada ifadenin benim denenmemiş revizyon bulunuyor:

    preg_match('#\<span class="SectionHeader"\>title\</span\>/\<br/\>/\<div class="header2"\>(.*)\</div\>\</span\>#',$str,$title);

Çift tırnaklı dizeler değişken ikame herhangi bir özelliğini kullanarak değil ve bu-ters eğik çizgi çift tırnak yanı sıra tersbölülerden hakkında herhangi bir belirsizlik (kaçınarak zorunda önler gibi tek tırnaklı, çift tırnaklı dize değiştirdi bkz the php manual on strings) - belki doğru dizeleri üretmek için iki katına olmalıdır. Çünkü (sürümünde ters bölü-çıkış değil bazıları) maç desen görünen bölü sayısının # hash çizgi / sınırlayıcı değişti.

Sizin ifade ile yanlış pek çok şey vardır:

  • Sen sınırlayıcı olarak / kullanılarak, ancak daha sonra çeşitli yerlerde / çıkmamış kullanın ediyoruz.
  • Sen < kaçan ve > görünüşte rasgele ediyoruz. Onlar hiç kaçtı olmamalıdır.
  • Sen nedense <br/> çevresindeki / s bazı haydut var.
  • Div için sınıf adı regex header2 olarak belirtilmiş ama Center olan örnek HTML
  • Başlık regex mytitle HTML ve title olduğunu

Düzeltilmiş bütün bunlar, olsun:

preg_match('(<span class="SectionHeader">mytitle</span><br/><div class="Center">(.*)</div\></span\>)',$data,$t);

Eğer herhangi bir başlık yerine belirli bir başlığı mytitle maç istiyorsanız, sadece .*? ile değiştirmek.