PHP preg_filter返回意外的长值

时间:2014-09-23 11:13:50

标签: php wordpress woocommerce

尝试在Woocommerce中删除标签并过滤值,但无法管理o以正确的格式获取它。有点可疑..

使用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 = '&#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 个答案:

答案 0 :(得分:1)

只是一个猜测:

也许WC()->cart->get_cart_subtotal()会返回'<span class="amount">2,429107114kr</span>',但是当您显示它时,您会看到<span class="amount">2,429kr</span>,因为有一些围绕它的JavaScript。

答案 1 :(得分:1)

好的,所以这就是正在发生的事情。 get_cart_subtotal()返回HTML编码的字符串。因为您没有查看实际的来源,而是查看var_dump - 并查看您看到的<span class="amount">2,429kr</span>的HTML,实际上“k”和“r”被编码到它们的等价物中HTML实体(基于他们的ASCII codes),&#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