正则表达式获取span标签的innertext

时间:2009-11-28 11:57:47

标签: php regex

我想解析下面的字符串以获取值“46.4400 INR”

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

我需要使用哪种正则表达式?

5 个答案:

答案 0 :(得分:7)

// 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

答案 1 :(得分:2)

我认为人们在这个“不能使用正则表达式来解析HTML”的圣战中走得太远了。 解析(X | HT)ML 与解析恰好包含一些HTML标记的简单字符串之间存在差异。

根据问题中的规范,这应该做:

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

答案 2 :(得分:1)

为什么要使用正则表达式?我认为您应该将x / html文档读入simlpleXml并使用xpath来检索所需的值。当然你可以使用正则表达式,但是xpath-solution会更好,imo。

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

答案 3 :(得分:0)

$subject = "<div id=currency_converter_result>1 USD = <span class=bld>46.4400 INR</span>";
$pattern = '/<div id=currency_converter_result>.*?<span.*?>(.*?)<\/span>/';
preg_match($pattern, $subject, $matches);
print_r($matches);

答案 4 :(得分:0)

DOM + Xpath&gt;正则表达式:

<?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;
    }
}
?>

当然可以随意使用simplexml或其他涉及代码较少的类似库。

如果HTML被改变为米兰建议,所选择的答案中断的示例:

<?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 ( ) 

其他正则表达式回答:

<?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

我的DOM / Xpath解决方案与更改的标记完美配合:

<?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
    }
}
?>