Prestashop 1.6 product.tpl正则匹配商品名称生成标识问题求助
在PrestaShop 1.6的product.tpl中实现商品名称关键词检测的解决方案
这个需求完全可行!你的代码思路没问题,但几个小细节导致它无法正常工作,我帮你梳理并修复:
原代码的问题点
- 正则表达式缺少分隔符:PHP的
preg_match()要求正则表达式必须用分隔符(比如/、#等)包裹,你直接写^.*gold|Gold|GOLD.*会触发语法错误。 - 重复冗余的正则规则:你重复写了小写
gold两次,而且可以通过正则的不区分大小写修饰符i来简化,不用手动枚举所有大小写组合。 - Smarty变量语法问题:在Smarty的
preg_match调用里,变量不需要额外套{},直接写$product->name|escape:'html':'UTF-8'即可。 - elseif的语法冗余:Smarty里
elseif后面不需要额外加括号,写法可以更简洁。
修复后的代码
这里提供两种实现方式,推荐第一种更简洁的版本:
方式一:使用不区分大小写修饰符简化正则
{if preg_match('/^.*gold.*$/i', $product->name|escape:'html':'UTF-8')} <span class="new-box"> <span class="zlato-label">GOLD 24K</span> </span> {elseif preg_match('/^.*rosegold.*$/i', $product->name|escape:'html':'UTF-8')} <span class="new-box"> <span class="zlato-label">Rose GOLD 24K</span> </span> {else} <span class="new-box"> <span class="new-label">Nothing</span> </span> {/if}
方式二:保留原大小写枚举逻辑(不推荐,但适配你的原始思路)
如果一定要手动枚举大小写组合,记得加上分隔符:
{if preg_match('/^.*gold|Gold|GOLD.*$/', $product->name|escape:'html':'UTF-8')} <span class="new-box"> <span class="zlato-label">GOLD 24K</span> </span> {elseif preg_match('/^.*rosegold|Rosegold|ROSEGOLD.*$/', $product->name|escape:'html':'UTF-8')} <span class="new-box"> <span class="zlato-label">Rose GOLD 24K</span> </span> {else} <span class="new-box"> <span class="new-label">Nothing</span> </span> {/if}
关键修改说明
- 正则分隔符:用
/包裹正则内容,这是PHP正则函数的强制要求,否则会抛出preg_match(): No ending delimiter '/' found的错误。 i修饰符:加在正则结束分隔符后面(比如$/i),表示匹配时不区分大小写,这样一行正则就能覆盖gold、Gold、GOLD等所有大小写组合,简化代码。- Smarty变量写法:在Smarty的函数调用中,变量直接引用即可,不需要额外的
{}包裹,否则会导致语法解析错误。
内容的提问来源于stack exchange,提问作者Jakub Brezovský
相关产品推荐
相关产品推荐

