Son
  • alın
  • 6 Cevap php

    I have a string variable that contains a lot of HTML markup and I want to get the last <li> element from it. Im using something like:

    $markup = "<body><div><li id='first'>One</li><li id='second'>Two</li><li id='third'>Three</li></div></body>";
    
    preg_match('#<li(.*?)>(.*)</li>#ims', $markup, $matches);
    $lis = "<li ".$matches[1].">".$matches[2]."</li>";
    $total = explode("</li>",$lis);
    $num = count($total)-2;
    echo $total[$num]."</li>";
    

    Bu çalışır ve ben son <li> elemanı basılı olsun. Ben dizinin son 2 dizin çıkarmak zorunda Ama neden ben anlayamıyorum $total. Normalde ben sadece endeksi 0 üzerinde başlar sayma beri son endeksi çıkarmak istiyorum. Ben ne eksik?

    Dizeden son <li> elemanı almanın daha iyi bir yolu var mı?

    6 Cevap

    HTML düzenli değildir, ve bu yüzden düzenli bir ifade ile çözümlenen olamaz. Bir proper HTML parser kullanın.

    Zaten jQuery kullanmak için nasıl biliyorsanız, aynı zamanda phpQuery bakmak olabilir. Bu kolayca sadece jQuery gibi dom unsurları, erişmenizi sağlayan bir PHP kütüphanesi bulunuyor.

    PHP.net belgeleri:

    If matches is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches[1] will have the text that matched the first captured parenthesized subpattern, and so on.
    

    $ Karşılaşmalar [0] tamamlandı maç (yakalanan bit sadece)

    Eğer 2 yakalama groupds çünkü ikinci indeksi ayıklamak için:

    $matches[0]; // Contains your original string
    $matches[1]; // Contains the argument for the LI start-tag (.*?)
    $matches[2]; // Contains the string contained by the LI tags (.*)
    

    'Ayrıştırma' (x) html dizeleri düzenli ifadeler ile sert ve beklenmedik sorunlarla dolu olabilir. (x) html normal bir dil değildir, çünkü basit levhası dizeleri daha fazla ayrıştırma mümkün değildir.

    Eğer (test değil) kullanarak regex geliştirmek:

     /#<li([^>]*)>(.+?)</li>#ims/
    

    strrpos - bir dizge içinde bir karakter son oluşumu pozisyonunu bul

    @ OP, Kendi basit görünüyor, bu yüzden ayrıştırıcıları veya regex gerek.

    $markup = "<body><div><li id='first'>One</li><li id='second'>Two</li><li id='third'>Three</li></div></body>";
    $s = explode("</li>",$markup,-1);
    $t = explode(">",end($s));
    print end($t);
    

    çıktı

    $ php test.php
    Three