尝试在 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
$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;
所以真正的值(value)是:
<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 codes ), k
和r
.
这也是为什么 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
关于PHP preg_filter 返回意外的长值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25993634/