使用PHP将标记中的值增加固定百分比

时间:2014-02-16 06:18:06

标签: php html string

我想使用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);
}

但是效果并不好。我怎样才能正确实现这个目标?

2 个答案:

答案 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>的值。

Demo