Регулярное выражение для получения внутреннего текста тега span - PullRequest
0 голосов
/ 28 ноября 2009

Я хотел бы проанализировать следующую строку, чтобы получить значение "46.4400 INR"

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

Какое регулярное выражение мне нужно использовать для этого?

Ответы [ 5 ]

7 голосов
/ 28 ноября 2009
// 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

2 голосов
/ 28 ноября 2009

Я думаю, что люди зашли слишком далеко в этой "не может использовать регулярные выражения для анализа HTML" священной войны.Существует различие между синтаксическим анализом (X | HT) ML и синтаксическим анализом простой строки, которая содержит несколько тегов HTML.

В соответствии со спецификациями в вопросе это должно сделать:

preg_match('#<span class=bld>(.*?)</span>#', $string, $match);
$value = $match[1];
1 голос
/ 28 ноября 2009

Почему вы используете регулярные выражения? Я думаю, что вы должны прочитать ваш документ x / html в simlpleXml и использовать xpath для получения желаемого значения. Конечно, вы можете использовать регулярные выражения, но xpath-решение было бы лучше, imo.

$xml = simplexml_load_file("/path/to/document.html");
$node = $xml->xpath("/path/in/doc/to/span[class=bld]");
...
0 голосов
/ 28 ноября 2009

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

Конечно, не стесняйтесь использовать 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
    }
}
?>
0 голосов
/ 28 ноября 2009
$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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...