Bir etiketleri arasındaki metni almak

5 Cevap php

Ben bir HTML dosyasından bağlantı metni almak için çalışıyorum. Bağlantının her kendilerine uygulanan özel bir sınıf var, ama adresler farklıdır.

Ben şu var:

...
<a class="fetch-me" href="products/1">Find ME!!!</a>
...
<a class="fetch-me" href="products/2">Me too!</a>
...

Ben şu PHP kodu kullanarak, ama hep istediğimi daha alıyorum:

preg_match_all('<a class="fetch-me" href=".*">(.*)</a>)siU', $string, $matching_data);

5 Cevap

<?php

$str = '
<a class="fetch-me" href="products/1">Find ME!!!</a>
...
<a class="fetch-me" href="products/2">Me too!</a>
';

$doc = new DOMDocument();
$doc->loadHTML($str);
$xp = new DOMXpath($doc);
$query = $xp->evaluate('//a[@class="fetch-me"]');

if ( $query->length > 0 ) {
    foreach ($query as $anchor ) {
    echo $anchor->nodeValue . '<br>';
    }
}

Ayrıca @contains birden fazla sınıf değerleri önemli ise @class, her zaman yanı sıra DOM için bir soyutlanmış yüksek seviyede kapsayıcı kullanabilir birlikte kullanabilirsiniz.

Ne hakkında bir şey gibi:

/<a[^>]*([^<]*)<\/a>/siU

tek yön

$str= <<<A
blah blah
blah
...
<a class="fetch-me" href="products/1">Find ME!!!</a>
<a class="fetch-me" href="products/2">Me too!</a>
blah
blah
<a class="fetch-me"
          href="products/1">Find me, i am at next line!!!</a> blah blah
A;
$s = explode("</a>",$str);
foreach ($s as $k ){
    if (strpos($k,"href" ) !==FALSE ){
        print "--> ". preg_replace("/^.*href=\".*\">|\">.*/sm","",$k)."\n";
    }
}

çıktı

$ php test.php
--> Find ME!!!
--> Me too!
--> Find me, i am at next line!!!

Herkesin dediği gibi İdeal olarak, gerçek bir ayrıştırıcı kullanmak gerekir.

Ben bu cevapların hepsini denedim ve herkes muhtemelen doğru. Ben HTML Tidy ve gerçek bir ayrıştırıcı kullanmak için refactor için gidiyorum.

Öneriniz için teşekkür ederiz.

Eğer bir regex kullanmanız gerekiyorsa, .*? yerine .* kullanımı. *? * ve non-greedy versiyonudur; diğer bir deyişle, daha çok mümkün olduğunca uyan daha fazla, bu mümkün olduğu kadar az eşleşir.

(Bu arada, {[(0)];} böyle yalanlar madness Bunun yerine, HTML veya XML ayrıştırıcı kullanarak deneyin Eğer don '.. t, bir HTML çözümleyici var HTML Tidy bunu üzerinden çalıştırmak ve bir XML ayrıştırıcı kullanmak. meder's answer PHP bunu nasıl bakın.).