You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Smarty模板中如何判断分类ID前两位为指定字符实现前缀匹配

Smarty模板校验分类ID指定前缀的正确实现

原有代码问题

strstr修饰符的匹配逻辑是查找字符串任意位置是否存在目标子串,只要分类ID中包含"11""15""16"字符段就会命中,才会出现111523这类中间带目标字符的ID被误匹配的问题,不符合「仅匹配以指定字符开头的ID」的需求。

实现方案

优先选择字符串截取对比的方案,逻辑直观无正则兼容问题,同时可以合并重复判断分支,简化代码:

{if !$product.add_to_cart_url 
    || $product->quantity < 2 
    || (in_array(($product->id_category_default)|string_format:"%s"|substr:0:2, ['11','15','16']) && $product->quantity < 10)
}disabled
{/if}

代码说明

  • |string_format:"%s":先将分类ID强制转为字符串格式,避免纯数字类型ID在不同PHP环境下字符串函数处理的兼容问题
  • |substr:0:2:从字符串第0位开始截取2个字符,也就是取ID的前两位
  • in_array(..., ['11','15','16']):判断截取到的前两位是否属于目标前缀列表,后续如果要新增前缀只需要往数组里加值即可,不用重复写判断分支

如果习惯用正则匹配,也可以用前缀正则写法,^在正则中代表字符串起始位置,只会匹配开头的目标字符:

{if !$product.add_to_cart_url 
    || $product->quantity < 2 
    || (preg_match('/^(11|15|16)/', $product->id_category_default) && $product->quantity < 10)
}disabled
{/if}

避坑提示

  • 不要用strstr/strpos类全字符串查找函数做前缀匹配,这类函数不限制匹配位置,必然会出现中间字符误判的问题
  • 原代码中多个elseif分支的判断逻辑完全一致(前缀不同但库存阈值都是<10),不需要拆分多个重复分支,合并后可维护性更高

内容的提问来源于stack exchange,提问作者Nesta78

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:06:31