我正在使用SimpleCart JS,我一直在为它编写优惠券代码扩展。由于SimpleCart使用DOM和cookie的组合来计算价格(我已经控制了这个问题的DOM部分),我必须更改cookie中的一组特定值,以便实际改变那些项目的价格。在输入优惠券之前,在购物车中。
以下是我的问题:如何更改此Cookie字符串中price=
个变量的值?
这是SimpleCart创建的cookie:
ID = C4 ||量= 1个||名称= XS%20Shirt%20%28Green%29 ||价= 10 ++ ID = C5 ||量= 1个||名称= XS%20Shirt%20%28Royal %20Blue%29 ||价= 10 ++ ID = C6 ||量= 1个||名称=%20Book ||价格= 45.50
目前,我正在使用POST将其发送到PHP脚本,然后将其爆炸成阵列,但我无法找到一种隔离价格的方法,以便我可以用折扣修改它们。将价格与ID分开的++
会让我失望。我确信Regex可以做到这一点,但我对它的所有尝试都失败了。
这是我目前用来处理字符串的PHP脚本:
$currentCookie = $_POST['currentCookie'];
$amount = $_POST['couponAmount'];
$orderArray = explode('||',$currentCookie);
print_r($orderArray);
鉴于上述字符串,此脚本将返回以下内容:
Array ( [0] => id=c4
[1] => quantity=1
[2] => name=XS%20Shirt%20%28Green%29
[3] => price=10++id=c5
[4] => quantity=1
[5] => name=XS%20Shirt%20%28Royal%20Blue%29
[6] => price=10++id=c6
[7] => quantity=1
[8] => name=%20Book
[9] => price=45.50 )
我需要根据$amount
变量修改价格值。 $ _POST字符串如下所示:
?currentCookie=id=c4||quantity=1||name=XS%20Shirt%20%28Green%29||price=10++id=c5||quantity=1||name=XS%20Shirt%20%28Royal%20Blue%29||price=10++id=c6||quantity=1||name=%20Book||price=45.50&amount=10
目标是在$amount = 10
时将所有价格降低10%。数学部分如下所示:
$newPrice = $currentPrice - ($amount / 100 * (currentPrice));
$currentCookie = $_POST['currentCookie'];
function applyDiscount($price){
$couponAmount = $_POST['couponAmount'];
$newPrice = $price - ($couponAmount / 100 * ($price));
return round($newPrice, 2);
}
$orderArray = explode('||',$currentCookie);
$output = array();
$pricePattern = '/(price=)([^\+]*)/';
foreach($orderArray as $item){
$currentPrice = preg_match($pricePattern, $item, $matches);
$newPrice = preg_replace($pricePattern, applyDiscount($matches[2]), $item);
if ($matches){
array_push($output, 'price='.$newPrice);
} else {
array_push($output, $item);
}
}
$output = implode('||', $output);
echo $output;
这将获取传入的字符串,将其拆分为数组,搜索并修改价格(感谢@stema),然后替换价格变量。
将所有内容缝合在一起并发送回页面,其中jQuery将旧cookie替换为新cookie。
如果有人对此有更好或更优雅的解决方案,我真的很乐意听到它。这感觉很笨,但它确实有效。
答案 0 :(得分:0)
您可以在此处找到价格
(price=)([^\+]*)
我将price=
放在第1组中,将值放在第2组中。这里的技巧是匹配任何不是+
的内容。当每个价格真正受到+
或字符串末尾的限制时,这将有效。
然后,您可以使用$1NEWPRICE
替换。