Я хочу найти и изменить несколько цен, используя 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
...
То, что я пробовал до сих пор:
Я попытался использовать fucntion, чтобы получить строку (номер цены) между $
и </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);
}
Но это не получилось очень хорошо. Как я могу правильно это достичь?
Для достижения этого используйте парсер 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>
.
Если вы должны сделать это, используя строковые функции вместо 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);