WordPress — PHP preg_filter возвращает неожиданное длинное значение

Попытка удалить теги и значение фильтра в Woocommerce, но не удается получить его в правильном формате. Что-то подозрительно ..

Использую WC()->cart->get_cart_subtotal(); чтобы получить значение. В этом примере мое значение 2,429kr, а необработанное возвращаемое значение <span class="amount">2,429kr</span>

$cart_total = WC()->cart->get_cart_subtotal();
$cart_total_format = strip_tags($cart_total);
$cart_value = preg_filter("/[^0-9,.]/", "", $cart_total_format);

echo $cart_value;

Результат = 2,429107114
ожидаемый = 2,429

Я не волшебник PHP, поэтому я подумал, что делаю что-то не так, и попробовал несколько разных подходов и методов без получения правильного результата.

Затем я попытался запустить сырой выход из WC()->cart->get_cart_subtotal(); в виде строки $

$string_total = '<span class="amount">2,429kr</span>';
$string_total_format = strip_tags($string_total);
$string_value = preg_filter("/[^0-9,.]/", "", $string_total_format);

echo $string_value;

Результат = 2,429
ожидаемый = 2,429

Зачем? 🙁

Обновить

Нашел это, когда копался в Woocommerce @Github

case 'SEK' : $currency_symbol = '&#107;&#114;'; break;

Итак, реальная ценность:

<span class="amount">2,429&#107;&#114;</span>

Теперь вопрос в том, что лучше всего отфильтровать? Мой быстрый способ исправить это, это не красиво, но исправить проблему.

$cart_total = WC()->cart->get_cart_subtotal();
$cart_total_format = strip_tags($cart_total);
$cart_value = preg_filter("/[^0-9,.]/","", $cart_total_format);
$cart_value_new = preg_filter("/107114/",".", $cart_value);

echo $cart_value_new;

Результат = 2,429
ожидаемый = 2,429

2

Решение

Итак, это то, что происходит. get_cart_subtotal() возвращает строку в кодировке HTML Потому что вы не смотрите на фактический источник, а скорее var_dumpи посмотрев на HTML, который вы видите <span class="amount">2,429kr</span>когда на самом деле «k» и «r» закодированы в их эквивалентные объекты HTML (на основе их Коды ASCII), &#107; а также &#114,

Вот почему var_dump шоу string(45) "2,429kr" когда это на самом деле должно вернуться string(7) "2,429kr" если валюта не была закодирована (и <span> теги не были интерпретированы браузером).

Затем, когда вы применяете preg_filterон также включает в себя числа из сущностей HTML, потому что они соответствуют регулярному выражению.

Таким образом, самое простое решение — декодировать все объекты HTML. до фильтрация:

$cart_total = html_entity_decode($cart_total, ENT_QUOTES, 'UTF-8');

поэтому ваш код становится:

$cart_total = WC()->cart->get_cart_subtotal();
$cart_total = html_entity_decode($cart_total, ENT_QUOTES, 'UTF-8');
// rest of your code
1

Другие решения

Просто предположение:

Может быть WC()->cart->get_cart_subtotal() вернуть '<span class="amount">2,429107114kr</span>', но когда вы показываете это, вы видите <span class="amount">2,429kr</span> из-за некоторого JavaScript, который вокруг этого.

1

По вопросам рекламы [email protected]