我想使用php查找并更改多个价格。例如所有数字增加/减少20%。
<table>
<tr>
<td>product name</td>
<td>$88</td>
</tr>
<tr>
<td>product name</td>
<td>$98</td>
</tr>
<tr>
<td>product name</td>
<td>$78</td>
</tr>
<tr>
<td>product name</td>
<td>$106</td>
</tr>
<tr>
<td>product name</td>
<td>$188</td>
</tr>
</table>
预期结果:
增加20%:
$88 x 20% + $88 => $105.6
$98 x 20% + $98 => $117.6
...
到目前为止我尝试了什么:
我尝试使用功能获取$
和</td>
之间的字符串(价格编号),然后更改它:
function get_string_between($string, $start, $end){
$string = " ".$string;
$ini = strpos($string,$start);
if ($ini == 0) return "";
$ini += strlen($start);
$len = strpos($string,$end,$ini) - $ini;
return substr($string,$ini,$len);
}
但是效果并不好。我怎样才能正确实现这个目标?
答案 0 :(得分:2)
如果必须使用字符串函数而不是HTML DOM Parser,则可以使用preg_replace_callback()
:
$result = preg_replace_callback('#(<td>\$)(\d+)(</td>)#', function($match) {
return $match[1] . $match[2]*1.20 . $match[3];
}, $html);
答案 1 :(得分:2)
使用HTML解析器来实现此目的。以下是使用内置DOMDocument
类的解决方案:
$percentage = 20;
$dom = new DOMDocument;
$dom->loadXML($html);
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
foreach ($dom->getElementsByTagName('td') as $tag) {
if (preg_match('/\$(\d+)/', strval($tag->nodeValue), $matches)) {
$currVal = $matches[1];
$newVal = $currVal + ($currVal * $percentage / 100);
$tag->nodeValue = '$'. $newVal;
}
}
echo $dom->saveHTML();
正则表达式/\$(\d+)/
用于检查节点是否包含格式为$<any_number>
的值。