我想用空字符串替换某些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
答案 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