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
的目的是什么?为什么忽略逗号上的大小写?