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

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

Использую WC()->cart->get_cart_subtotal(); для получения значения. В этом примере мое значение равно 2429kr, а необработанное возвращаемое значение <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

 $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 = 'kr'; break; 

Таким образом, реальная ценность:

 <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); $cart_value_new = preg_filter("/107114/",".", $cart_value); echo $cart_value_new; 

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

Хорошо, так это то, что происходит. 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 

Просто догадка:

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