Bir div maç php düzenli ifade

2 Cevap php
<?php

/**
 * @author Joomlacoders
 * @copyright 2010
 */
    $url="http://urlchecker.net/html/demo.html";

    $innerHtml=file_get_contents($url);

    //echo $innerHtml;
    preg_match_all("{\<div id='news-id-.*d'\>(.*)\</div\>}",$innerHtml,$matches);

          //<div id='news-id-160346'>            

    var_dump($matches);

?>

I = 'haber-id-160346' div id tüm içeriği bulmak istiyorum. Lütfen bana yardımcı olun

2 Cevap

Use an HTML parser. NOT düzenli ifadeler.

Düzenli ifadeler ile sorun iç içe geçmiş yapıları maç olamaz olmasıdır. Senin regex varsayarsak tek <div> maç ve kapanış etiketi, doğru bu giriş maç için hiçbir yolu yoktur gerekir:

<div id="a">
    <div id="b">
        Foo
    </div>
</div>
<div id="c">
    Bar
</div>

Düzenli ifade açgözlü ise, bu iki üst divs maç olacak, ve bu ungreedy ise, bu doğru bitiş etiketi maç olmayacak çünkü.

Bu nedenle, bir HTML çözümleyici kullanmalısınız. PHP ile, DOMDocument::loadHTML or DOMDocument::loadHTMLFile each do a fairly good job. (You may "safely" ignore the warnings it generates: they're only markup errors, and the generated DOMDocument nesne hemen hemen tamam olmalıdır.)

PHP getElementById işe almak için bir ağrı olduğundan, aynı amaç için DOMXPath kullanabilirsiniz:

<?php

$url = "http://urlchecker.net/html/demo.html";

$d = new DOMDocument();
$d->loadHTMLFile($url);

$xpath = new DOMXPath($d);
$myNews = $xpath->query('//@id="news-id-160346"')->item(0);

?>

Diğerleri önerdiği gibi bir ayrıştırıcı kullanın.

Ya da bu regex deneyin:

preg_match_all("#<div [^>]*id=['\"]news-id-\\d+['\"](.*?)</div>#", $innerHtml, $matches);
print_r($matches);

Html ayrıştırma için print_r açıklamada to understand why regex is not considered as the right tool çıkışını kontrol edin.