2014-09-23 105 views
2

尝试去除Woocommerce中的标签和过滤器值,但无法管理o以正确的格式获取它。有些东西是可疑的..PHP preg_filter返回意外的长值

正在使用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 @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

+0

首先,你的正则表达式是不同的。第一个不包括千位和小数分隔符,但我想你确实将它们包含在你的代码中。 而且,如果你在第一行之后有'var_dump($ cart_total)',你可以得到'string(35)“,这个值是2,429kr”',对不对? – 2014-09-23 11:25:28

+0

是的,这是一个错字,编辑我的文章。 '的var_dump($ cart_total);''给出的字符串(45) “2,429kr”' 使用或不使用HTML,无论它仍然会工作,并导致相同的预期值 – 2014-09-23 11:32:58

+1

'字符串(45)“2,429kr “'应该是字符串(7)”2,429kr“' – 2014-09-23 11:50:14

回答

1

好吧,这就是发生了什么。 get_cart_subtotal()返回一个HTML编码的字符串。因为你没有看到实际的源代码,而是看着你看到的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 
+0

你能给我整个片段吗?尝试过,但没有得到它产生正确的结果,希望看到它的工作。 – 2014-09-23 12:59:40

+0

在代码中的第一行和第二行之间调用'get_cart_subtotal()'后,只需添加我的代码。 – 2014-09-23 13:00:57

+0

我已经在我的答案中添加了另一个片段,以准确显示在哪里输入新的代码行。 – 2014-09-23 13:03:39

1

只是一个猜测:

也许WC()->cart->get_cart_subtotal()回报'<span class="amount">2,429107114kr</span>',但是当你显示它您看到<span class="amount">2,429kr</span>因为一些JavaScript这一轮吧。

+0

你在赛道上的东西,还没有找到任何Javascript,但在我的代码中找到了这个价格值被注释掉的地方 '<! - 179 k r - >' 没有运行这个'< - ! - >'和得到这个'< - 的 2429 k r - >' 基本上'k&#114'被添加作为货币 运行'<跨度类= “量”> 2,4 29 k r'给出2,429kr – 2014-09-23 12:05:34