Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP数组str_替换整个单词_Php_Regex_Preg Replace_Str Replace_Word Boundary - Fatal编程技术网

PHP数组str_替换整个单词

PHP数组str_替换整个单词,php,regex,preg-replace,str-replace,word-boundary,Php,Regex,Preg Replace,Str Replace,Word Boundary,我在一个很长的字符串上执行str\u replace,我的$search是一个数组 $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

我在一个很长的
字符串上执行
str\u replace
,我的
$search
是一个
数组

$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\u替换
使用正则表达式的可能方法如下:

$result = preg_replace(
    '/\b(tag_name_item(_category)?)\b/',
    '$1' . $suffix,
    $string
);
$result = preg_replace(
    '/\b(tag_name[a-z_]*)\b/',
    '$1' . $suffix,
    $string
);
工作原理:

  • \b
    :正如您所说的单词边界,这是为了确保我们只匹配单词,而不是单词部分
  • :我们希望在替换字符串中使用部分匹配项(
    标记名称索引
    必须替换为自身+后缀)。这就是我们使用匹配组的原因,因此我们可以在替换字符串中引用匹配项
  • tag\u name\u index
    是该字符串的文本匹配
  • (\u category)
    :另一个文本匹配,通过使用
    操作符分组并成为可选。这确保我们同时匹配
    标记名称项目
    标记名称项目\u category
  • :第一组的末尾(可选的
    \u类别
    匹配是第二组)。从本质上说,这组人掌握着我们将要替换的整场比赛
  • \b
    :再次设置单词边界
这些匹配项将替换为
“$1”$后缀
$1
是对第一个匹配组的引用(表达式中外括号内的所有内容)。您可以使用
$2
引用第二组,但我们现在对该组不感兴趣

真的就这些了


更通用: 因此,您试图为所有以
tag\u name
开头的字符串添加后缀,根据您的示例判断,这些字符串后面可以有任意数量的大小写单词。更通用的正则表达式如下所示:

$result = preg_replace(
    '/\b(tag_name_item(_category)?)\b/',
    '$1' . $suffix,
    $string
);
$result = preg_replace(
    '/\b(tag_name[a-z_]*)\b/',
    '$1' . $suffix,
    $string
);
与前面一样,
\b
()
标记名的使用保持不变。改变的是:

  • [a-z]*
    :这是一个字符类。它与字符a-z(a到z)匹配,并下划线零次或多次(
    *
    )。它匹配
    \u item
    \u item\u category
    ,就像它匹配
    \u foo\u bar\u zar\u fefe
    一样
这些正则表达式是区分大小写的,如果您想匹配
tag\u name\u XYZ
,您可能需要使用
i
标志(不区分大小写):
/\b(tag\u name[a-z]*)\b/i


与前面一样,整个匹配项被分组,并在替换字符串中使用,我们在替换字符串中添加了
$suffix
,无论是什么为了避免问题,您可以使用
strtrtr
,它只解析字符串一次并选择最长的匹配项:

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

?>


请看

这是我给出的示例中非常具体的一个,您能让它更通用一些,这样它就不会局限于
类别
?基本上,我只想在所有以
tag\u name
开头的单词后面加上
$后缀
@PatrickGregorio:更新了我的答案,添加了一个更通用的表达式+解释了表达式的作用这是可行的!非常感谢。还有一个拥抱,谢谢你的解释!你在回答什么问题?这与OP无关。而
/\b、\b/i
的目的是什么?为什么忽略逗号上的大小写?