PHP 数组 str_replace 整个单词
PHP Array str_replace Whole Word
我正在做 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
.
使用正则表达式的可能方法 would/could 如下所示:
$result = preg_replace(
'/\b(tag_name_item(_category)?)\b/',
'' . $suffix,
$string
);
工作原理:
\b
:正如你所说的是单词边界,这是为了确保我们只匹配单词,而不是单词部分
(
:我们想在替换字符串中使用部分匹配项(tag_name_index
必须替换为自身 + 后缀)。这就是我们使用匹配组的原因,因此我们可以在替换字符串 中返回匹配项
tag_name_index
是该字符串的文字匹配。
(_category)?
:另一种文字匹配,通过使用 ?
运算符进行分组和可选。这确保我们匹配 tag_name_item
和 tag_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;
}
?>
我正在做 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
.
使用正则表达式的可能方法 would/could 如下所示:
$result = preg_replace(
'/\b(tag_name_item(_category)?)\b/',
'' . $suffix,
$string
);
工作原理:
\b
:正如你所说的是单词边界,这是为了确保我们只匹配单词,而不是单词部分(
:我们想在替换字符串中使用部分匹配项(tag_name_index
必须替换为自身 + 后缀)。这就是我们使用匹配组的原因,因此我们可以在替换字符串 中返回匹配项
tag_name_index
是该字符串的文字匹配。(_category)?
:另一种文字匹配,通过使用?
运算符进行分组和可选。这确保我们匹配tag_name_item
和tag_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;
}
?>