Açıklıklı etiketinin innerText almak için Düzenli İfade

4 Cevap php

Ben "46,4400 INR" değerini almak için aşağıdaki dizeyi ayrıştırmak istiyorum

<div id=currency_converter_result>1 USD = <span class=bld>46.4400 INR</span>
<input type=submit value="Convert">
</div>

Bunun için kullanmak ne düzenli ifade gerekiyor?

4 Cevap

// Create a DOM object from a URL
$html = file_get_html('http://www.example.com/');

echo $html->find('span.bld', 0)->innertext;

http://simplehtmldom.sourceforge.net/manual.htm

Ben insanların bu kutsal savaşı "html ayrıştırmak için regex kullanamazsınız" çok ileri gidiyorsun düşünüyorum. parsing (X|HT)ML ve birkaç HTML etiketlerini içermesi için olur basit bir dize ayrıştırma arasında bir fark yoktur.

Söz özelliklerine göre yapmalıdır:

preg_match('#<span class=bld>(.*?)</span>#', $string, $match);
$value = $match[1];

Neden normal ifadeler kullanmak istiyorsunuz? Ben simlpleXml içine x / html belgeyi okumak ve xpath istenen değerini almak için kullanmak gerektiğini düşünüyorum. Tabii ki can normal ifadeler kullanmak, ancak bir xpath çözüm imo, güzel olurdu.

$xml = simplexml_load_file("/path/to/document.html");
$node = $xml->xpath("/path/in/doc/to/span[class=bld]");
...

DOM + XPath> Regex:

<?php
$str = '
<div id=currency_converter_result>1 USD = <span class=bld>46.4400 INR</span>
<input type=submit value="Convert">
</div>';

$d = new DOMDocument();
$d->loadHTML( $str );
$x = new DOMXpath($d);
$xpr = $x->evaluate('//span[contains(@class, "bld")]');
if ( count( $xpr ) ) {
    foreach ( $xpr as $el ) {
    echo $el->nodeValue;
    }
}
?>

Tabii simplexml ya da daha az kod içeren diğer benzer kütüphaneleri kullanmak için çekinmeyin.

Seçilen cevap kırma örneği, HTML olarak değişmiş ise Milan önerdi:

<?php
$subject = '
<div>
<div id=currency_converter_result/><b/>1 USD = <span class=bld one>46.4400 INR</span>
<input type=submit value="Convert">
</div></div><span/>';

$pattern = '/<div id=currency_converter_result>.*?<span.*?>(.*?)<\/span>/';
preg_match($pattern, $subject, $matches);
print_r($matches); // output is Array ( )

Diğer regex cevap kırılma:

<?php
$subject = '
<div>
<div id=currency_converter_result/><b/>1 USD = <span class=bld one>46.4400 INR</span>
<input type=submit value="Convert">
</div></div><span/>';

preg_match('#<span class=bld>(.*?)</span>#', $subject, $match);
$value = $match[1];
var_dump($value); // outputs NULL

Benim DOM / XPath çözüm değişmiş biçimlendirme ile mükemmel çalışır:

<?php
$subject = '
<div>
<div id=currency_converter_result/><b/>1 USD = <span class=bld one>46.4400 INR</span>
<input type=submit value="Convert">
</div></div><span/>';

$d = new DOMDocument();
$d->loadHTML( $subject );
$x = new DOMXpath($d);
$xpr = $x->evaluate('//span[contains(@class, "bld")]');
if ( count( $xpr ) ) {
    foreach ( $xpr as $el ) {
    echo $el->nodeValue; // output 46.4400 INR
    }
}
?>