PHP 数组 str_replace 整个单词

PHP Array str_replace Whole Word

我正在做 str_replace 很长的 string 而我的 $searcharray.

$search = array(
    " tag_name_item ",
    " tag_name_item_category "
);

$replace = array(
    " tag_name_item{$suffix} ",
    " tag_name_item_category{$suffix} "
);

echo str_replace($search, $replace, $my_really_long_string);

之所以在$search$replace上加空格是因为我只想匹配整个单词。正如您从我上面的代码中猜到的那样,如果我删除空格并且我的真正长字符串是:

...
tag_name_item ...
tag_name_item_category ...
...

然后我会得到类似

的东西
...
tag_name_item_sfx ...
tag_name_item_sfx_category ...
...

这是错误的,因为我想要以下结果:

...
tag_name_item_sfx ...
tag_name_item_category_sfx ...
...

所以怎么了?

没什么,它确实有效。但我不喜欢它。看起来很脏,编码不好,效率低下。

我意识到我可以使用 \b 修饰符使用正则表达式来做这样的事情,但我不擅长使用正则表达式,所以我不知道如何 preg_replace.

使用正则表达式的可能方法 would/could 如下所示:

$result = preg_replace(
    '/\b(tag_name_item(_category)?)\b/',
    '' . $suffix,
    $string
);

工作原理:

  • \b:正如你所说的是单词边界,这是为了确保我们只匹配单词,而不是单词部分
  • (:我们想在替换字符串中使用部分匹配项(tag_name_index 必须替换为自身 + 后缀)。这就是我们使用匹配组的原因,因此我们可以在替换字符串
  • 中返回匹配项
  • tag_name_index 是该字符串的文字匹配。
  • (_category)?:另一种文字匹配,通过使用 ? 运算符进行分组和可选。这确保我们匹配 tag_name_itemtag_name_item_category
  • ):第一组结束(可选的_category匹配是第二组)。这个组,基本上,包含我们要替换的整个比赛
  • \b: 再次出现单词边界

这些匹配被替换为 '' . $suffix</code> 是对第一个匹配组的引用(表达式中外括号内的所有内容)。您可以使用 <code> 引用第二组,但我们现在对该组不感兴趣。

真的就这些了


更通用:

因此,您正在尝试为所有以 tag_name 开头的字符串添加后缀,根据您的示例判断,后跟任意数量的 snake_cased 单词。一个更通用的正则表达式看起来像这样:

$result = preg_replace(
    '/\b(tag_name[a-z_]*)\b/',
    '' . $suffix,
    $string
);

和以前一样,\b()tag_name 文字的用法保持不变。改变的是:

  • [a-z_]*:这是一个字符class。它匹配字符 a-z(a 到 z),下划线零次或多次 (*)。它匹配 _item_item_category,就像匹配 _foo_bar_zar_fefe.
  • 一样

这些正则表达式 区分大小写 ,如果你想匹配 tag_name_XYZ 之类的内容,你可能需要使用 i 标志(不区分大小写):/\b(tag_name[a-z_]*)\b/i

像以前一样,整个匹配被分组,并用于替换字符串,我们向其添加 $suffix,无论它是什么

为了避免这个问题,你可以使用strtr只解析一次字符串并选择最长的匹配:

$pairs = [ " tag_name_item "          => " tag_name_item{$suffix} ",
           " tag_name_item_category " => " tag_name_item_category{$suffix} " ];

$result = strtr($str, $pairs);

此函数用匹配单词的数组元素替换整个单词而不是子字符串

<?PHP
      function removePrepositions($text){

            $propositions=array('/\b,\b/i','/\bthe\b/i','/\bor\b/i'); 

            if( count($propositions) > 0 ) {
                foreach($propositions as $exceptionPhrase) {
                    $text = preg_replace($exceptionPhrase, '', trim($text));

                }
            $retval = trim($text);

            }
        return $retval;
    }    

?>

entire example