Woocommerce get_cart_subtotal() 值包含干扰值清理过程的 HTML 实体

问题描述 投票:0回答:2

我正在尝试剥离标签并从 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 = '&#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

php wordpress woocommerce replace html-entities
2个回答
1
投票

好吧,这就是正在发生的事情。

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。

© www.soinside.com 2019 - 2024. All rights reserved.