PHP字符串互换替换异常求助:Cart与Bag互替换结果不符
问题原因
你当前的代码之所以会把所有Cart和Bag都变成Bag,是因为str_ireplace处理数组替换时是按顺序执行的:
- 先把所有
Bag替换成Cart,此时原有的Bag变成了Cart - 接着把所有
Cart(包括刚从Bag替换来的)替换成Bag
最后所有目标字符串都被二次替换成了Bag。
修正方案
方案1:使用临时占位符(简单直接)
通过一个不会出现在文本中的临时字符串作为中转,避免互相覆盖:
add_filter( 'gettext', function ( $strings ) { // 第一步:把Bag替换成临时占位符 $strings = str_ireplace( 'Bag', '__TEMP_REPLACE__', $strings ); // 第二步:把Cart替换成Bag $strings = str_ireplace( 'Cart', 'Bag', $strings ); // 第三步:把临时占位符替换成Cart $strings = str_ireplace( '__TEMP_REPLACE__', 'Cart', $strings ); return $strings; }, 20 );
方案2:使用正则回调(适合精确匹配单词)
如果需要只替换独立的Bag/Cart单词(避免替换类似ShoppingBag这类包含目标字符串的词),可以用preg_replace_callback:
add_filter( 'gettext', function ( $strings ) { // \b 表示单词边界,确保只匹配独立的Bag/Cart return preg_replace_callback('/\b(Bag|Cart)\b/i', function($matches) { // 判断匹配到的内容,返回对应的替换值 return strtolower($matches[0]) === 'bag' ? 'Cart' : 'Bag'; }, $strings); }, 20 );
内容的提问来源于stack exchange,提问作者Jituu
相关产品推荐
相关产品推荐

