PHP数组str_replace整个Word

时间:2016-04-11 16:37:36

标签: php regex preg-replace str-replace word-boundary

我正在 public T GetComponent<T>() where T : Component { foreach (var c in Components) { if (c is T) return (T)c; } foreach (var c in componentsToAdd) { if (c is T) return (T)c; } return null; } 进行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

3 个答案:

答案 0 :(得分: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开头的所有字符串后缀,根据你的例子判断,可以跟随任意数量的基于蛇的字。一个更通用的正则表达式看起来像这样:

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

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

  • [a-z_]*:这是一个角色类。它匹配字符a-z(a到z),并且下划线为零或更多次(*)。它与_item_item_category匹配,就像匹配_foo_bar_zar_fefe一样。

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

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

答案 1 :(得分:0)

要避免此问题,您可以使用<Directory Id="TARGETDIR" Name="SourceDir"> <Directory... 仅解析字符串一次并选择最长匹配:

strtr

答案 2 :(得分: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;
    }    

?>

请参阅entire example