我正在尝试剥离标签并从 Woocommerce 的
get_cart_subtotal()
方法返回的值中删除无关字符,但我无法设法以正确的格式获取它。有点可疑。
我正在使用
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 源代码时发现了这一点:
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 代码)、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
只是猜测:
也许
WC()->cart->get_cart_subtotal()
返回 '<span class="amount">2,429107114kr</span>'
,但是当你显示它时,你会看到 <span class="amount">2,429kr</span>
,因为它周围有一些 javascript。