Düzenli ifade yeni hat kırma

5 Cevap php

Ben aşağıdaki gibi bir düzenli ifade kullanmaya çalışıyorum:

preg_match_all('|<table.*</table>|',$html,$matches, PREG_SET_ORDER);

But this is not working, and I think the problem is the new line inside the string $html.
Could someone tell me a work around?


EDIT: I've realized that it's not right to use regex to parse HTML. Thanks to those who told me. :)

5 Cevap

http://www.codinghorror.com/blog/2009/11/parsing-html-the-cthulhu-way.html: Bir sonraki ne bir karar vermeden önce, bu ilk okumuştu

Genel olarak, bu RegEx'in HTML ayrıştırmak için iyi bir fikir değil.

I DOM kullanmanızı tavsiye

Bir alternatif olarak PHP Simple HTML DOM Parser kontrol edebilirsiniz.

Ana Özellikler:

  • PHP5 + ile yazılmış bir HTML DOM ayrıştırıcı size çok kolay bir şekilde HTML işlemek izin!
  • PHP 5 + gerektirir.
  • Geçersiz HTML desteği.
  • Sadece jQuery gibi seçiciler ile bir HTML sayfası üzerinde etiketleri bulun.
  • Tek satırda HTML içeriğini ayıklayın.

Eğer çok satırlı değiştirici denediniz mi m?

preg_match_all('|<table.*</table>|m',$html,$matches, PREG_SET_ORDER);

Var / s bayrağı kullanın. ' Ayrıca yeni hat karakterlere uygulanır, ya da sadece açıkça yeni çizgi karakterler kontrol - genellikle '[\ n \ r]'. Ben henüz kendim okumadım, ama http://www.pcre.org/pcre.txt de PCRE kütüphaneye daha fazla bilgi kontrol edebilirim

Dikkatli olsa sizin deseni oluşturmak nasıl - yanlış desenleri ile karışık satırsonu ile uzun giriş dizeleri açıklanamayan dosyası hatalarına ve bağlantı sıfırlar neden olabilir.

Senin durumunda, PCRE işlevleri burada gerekli görünmüyor, ve yine beklenmedik sonuçlara neden olabilir. Eğer sadece bir sayfada tek bir tablonun içeriğini ayıklamak için arıyorsanız, neden sadece en temel yapmayacağım ...

$start = stripos($input, "<table>");
$end = stripos($input, "</table>", $start);
$my_table = substr($input, $start, $end);

EDIT: Ben HTML ayrıştırmak için regex kullanmak doğru olmadığını fark ettik.

Daha iyi: bir SimpleXML nesnesine $html okumak ve SimpleXML ait ile bunu ayrıştırmak Xpath olabilir. (Güçlü ve DOM uzatma IMHO kullanmak çok daha kolay.)

Bu gibi:

$html = "<html><body><table id=\"mytbl\"><tr><td>ABC</td></tr><tr><td>DEF</td></tr></table></body></html>";

$xml = simplexml_load_string($html);

if($xml)
foreach($xml->xpath("/html/body/*") as $item) {
    echo $item["id"] . "<br>"; // mytbl
    foreach($item->tr as $tr) {
        echo $tr->td . "<br>"; // 1:ABC, 2:DEF
    }
}