Увеличьте значения в тегах <td> на фиксированный процент с помощью PHP

0

Я хочу найти и изменить несколько цен, используя 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);
}

Но это не получилось очень хорошо. Как я могу правильно это достичь?

  • 0
    Пожалуйста, опубликуйте ожидаемый результат (вместе с тем, что вы уже пробовали).
  • 0
    Не используйте поиск по строке или регулярному выражению для HTML, используйте библиотеку парсера DOM.
Показать ещё 6 комментариев
Теги:
string

2 ответа

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>.

демонстрация

  • 0
    Работает, спасибо!
  • 0
    @jlee: Рад, что помог!
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);
  • 0
    тоже работает, спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню