2014-09-23 40 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