PHP preg_filter 返回意外的长值

标签 php wordpress woocommerce

尝试在 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 = '&#107;&#114;'; break;

所以真正的值(value)是:

<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

最佳答案

好的,这就是正在发生的事情。 get_cart_subtotal()返回 HTML 编码的字符串。因为你看的不是实际来源,而是 var_dump - 并查看您所看到的 HTML <span class="amount">2,429kr</span> ,事实上“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

关于PHP preg_filter 返回意外的长值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25993634/

相关文章:

php - Laravel 错误声明 App\Exceptions\Handler::report(Throwable $exception)

php - ftp_get : Illegal PORT command

javascript - 如何在动态元素上添加多个类,其中一个类的数字递增?

php - 将 WooCommerce 自定义产品属性转换为定义的产品属性

php - 如何检查 woocommerce 产品是否分配了任何类别?

php - Laravel Eloquent 在更新时运行两个查询?

php - MySQL:将分钟转换为小时和分钟

wordpress - ACF Blocks 数据如何存储在数据库中

php - 有条件地删除单个页面的 Storefront 手持菜单

php - 在 Woocommerce 的购物车中自动添加或删除免费赠品产品