Düzenli ifadeler kullanarak HTML etiketleri innerText Başlarken

3 Cevap php

Ben bu verileri yakalarken sorun yaşıyorum:

              <tr>
                <td><span class="bodytext"><b>Contact:</b><b></b></span><span style='font-size:10.0pt;font-family:Verdana;
  mso-bidi-font-family:Arial'><b> </b> 
                      <span class="bodytext">John Doe</span> 
                     </span></td>
              </tr>
              <tr>
                <td><span class="bodytext">PO Box 2112</span></td>
              </tr>
              <tr>
                <td><span class="bodytext"></span></td>
              </tr>

    		  <!--*********************************************************


    		  -->
    		  <tr>
                <td><span class="bodytext"></span></td>
              </tr>



              <tr>
                <td><span class="bodytext">JOHAN</span> NSW 9700</td>
              </tr>
              <tr>
                <td><strong>Phone:</strong> 
                02 9999 9999
                    </td>
              </tr>

Basically, I want to grab everything after "Contact:" and before "Phone:" minus the HTML; however these two designations may not always exist so I need to really grab everything between the two colons (:) that isn't located inside a HTML tag. The number of <span class="bodytext">***data***</span> may actually vary so I need some sort of loop for matching these.

Ben could muhtemelen döngüler ve dize eşleşmeleri kullanarak bunu düzenli ifadeler kullanmayı tercih ederler.

Ayrıca, PHP regex olmayan eşleşen gruplar için sözdizimi bilmek istiyorum.

Herhangi bir yardım büyük mutluluk duyacağız!

3 Cevap

Ben doğru anlamak, HTML etiketleri arasında metinde tek ilgileniyoruz. HTML etiketleri yok saymak için, sadece ilk onları soymak:

$text = preg_replace('/<[^<>]+>/', '', $html);

Ve "Telefon:", kullanım: "İletişim" arasındaki her şeyi kapmak için

if (preg_match('/Contact:(.*?)Phone:/s', $text, $regs)) {
  $result = $regs[1];
} else {
  $result = "";
}

Konup her şeyi kapmak için kullanabilirsiniz:

if (preg_match('/:([^:]*):/', $text, $regs)) {
  $result = $regs[1];
} else {
  $result = "";
}

Soruları bu tür görünüşte keyfi yığın taşması yanıtı "omg Regexes kullanmayın! Yerine Beautiful Soup kullanın!" Gibi görünüyor. Şahsen ben bu gibi küçük görevler için dış kitaplıkları kullanmak zorunda değil tercih ve regexes iyi bir alternatiftir.

Bu mücadele için tek yoldur tüm HTML etiketleri, dışarı atmak için basit bir yolu, bu regex kullanmak için:

$text = preg_replace("/<.*?>/", "", $text);

o zaman uygun metin içeriğini kapmak gibi her türlü yöntemi kullanabilirsiniz.

(?:this won't match): Sigara eşleşen grupları bu gibi

screenscraping gibi geliyor, ya da istediğin bilgi bulduktan sonra sıra strip_tags() kullanabilirsiniz.