1

我做str_replace的很长string,我$search是一个array

$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

4

3 回答 3

1

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

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

这个怎么运作:

  • \b:正如你所说的单词边界,这是为了确保我们只匹配单词,而不是单词部分
  • (:我们想在替换字符串中使用部分匹配项(tag_name_index必须用自身替换 + 后缀)。这就是我们使用匹配组的原因,因此我们可以参考替换字符串中的匹配
  • tag_name_index是该字符串的文字匹配。
  • (_category)?: 另一个文字匹配,通过使用?运算符进行分组和可选。这可以确保我们同时匹配tag_name_itemtag_name_item_category
  • ):第一组的结尾(可选_category匹配是第二组)。从本质上讲,这个组拥有我们将要替换的整场比赛
  • \b: 又是单词边界

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

这就是它的全部


更通用:

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

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

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

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

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

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

于 2016-04-11T16:41:56.927 回答
0

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

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

$result = strtr($str, $pairs);
于 2016-04-11T17:07:50.517 回答
0

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

<?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;
    }    

?>

查看整个示例

于 2016-12-21T05:26:45.307 回答