选择表达式中最后$后的文本?

时间:2018-01-31 20:40:39

标签: php regex

我正在使用正则表达式从以下HTML中提取右边的价格:

<p class="pricing ats-product-price"><em class="old_price">$99.99</em>$94.99</p>

在PHP中使用preg match:

preg_match_all('!<p class="pricing ats-product-price"><em class="old_price">.*?<\/em>(.*?)<\/p>!', $output, $prices);

除此之外,我注意到有时HTML并不包含旧价格。所以有时HTML看起来像这样:

<p class="pricing ats-product-price">$129.99</p>

似乎我的目标应该是从表达式中提取 last 价格,换句话说,就是在最后一个问号之后和</p>之前直接跟随的文本。这种表达方式虽然超出了我的联盟 - 希望能在这里得到一些帮助。感谢。

1 个答案:

答案 0 :(得分:1)

将正则表达式组合与解析器一起使用:

<?php

$data = <<<DATA
    <p class="pricing ats-product-price">
        <em class="old_price">$99.99</em>
        $94.99
    </p>
    <p class="pricing ats-product-price">$129.99</p>
DATA;

# set up the dom
$dom = new DOMDocument();
$dom->loadHTML($data, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);

# set up the xpath
$xpath = new DOMXPath($dom);

$regex = '~\$\d+[\d.]*\b\s*\Z~';
foreach ($xpath->query("//p") as $line) {
    if (preg_match($regex, $line->nodeValue, $match)) {
        echo $match[0] . "\n";
    }
}

这会产生

$129.99
$129.99

<小时/> 该代码段会设置DOM,查询p个代码并搜索其中的最后价格。
请参阅a demo for the expression on regex101.com