preg_replace正在取代一切

时间:2014-04-19 04:58:05

标签: php regex html-parsing preg-replace

我想用空字符串替换某些html标记,并且只想检索文本。以下是我想要的例子。

preg_match_all("/<span id=\"priceblock_ourprice\" class=\"a-size-medium a-color-price\">(.*)<\/span>/U", $content, $matches);

上面一行检索这样的内容。

<span id="priceblock_ourprice" class="a-size-medium a-color-price">50</span>

现在,我只想检索整数值(即50)。我尝试了以下语句来删除HTML标记。

    foreach($matches[0] as $key=>$val) {
        $price = preg_replace( '/<(.*)>/', '', $val);
    }

但问题是,它取代了所有内容,并返回一个空字符串。它应该返回50,没有null。输出文件$ price变量应该是:

$price = 50

2 个答案:

答案 0 :(得分:2)

尝试在正则表达式中添加问号

foreach($matches[0] as $key=>$val) {
  $price = preg_replace( '/<(.*?)>/', '', $val);
}

这样可以找到第一个>而不是最后一个{{1}}。正则表达式是贪婪的,并会找到它可以做的一切。

另外,请记住,您执行此操作的方式将替换每个循环的$ price。我假设您在下一个循环发生之前以$ price做某事,但如果没有,您应该将价格存储在数组中。

答案 1 :(得分:2)

如果匹配超过预期,请使用?进行非贪婪匹配。贪婪(.*)将尽可能多地消耗,同时使其非贪婪(.*?)将阻止这种情况。

preg_replace('/<(.*?)>/', '', $val);

我会考虑使用DOM,下面就是一个例子。

$content = <<<DATA
<span id="priceblock_ourprice" class="a-size-medium a-color-price">50</span>
<span id="priceblock_ourprice" class="a-size-medium a-color-price">40</span>
<span id="foo">30</span>
DATA;

$doc = new DOMDocument();
$doc->loadHTML($content); // Load your HTML content

$xpath = new DOMXPath($doc);
$vals = $xpath->query("//span[@id='priceblock_ourprice']");

foreach ($vals as $val) {
   echo $val->nodeValue . "\n";
}

输出

50
40