如何使用一个或多个搜索词搜索字符串并在每次匹配后添加一个字符串?
How to search a string using one or more search words and add a string after each match?
给定一个由 space 分隔的一个或多个搜索字符串的字符串,我想在不区分大小写的情况下搜索文本中的匹配项。找到匹配项后,我想在匹配的子字符串后立即附加 <-
。
这是我试过的:
代码
public function my_replace(string $fullText, string $searchText){
$searches = explode(' ',$searchText);
$replace = array();
foreach ($searches as $i => $search){
$replace[] = $search . '<-';
}
return str_ireplace($searches, $replace, $fullText);
}
例子
echo my_replace('A week ago, Elvis left the Building', 'elvis left');
输出
A week ago, elvis<- left<- the Building
期望输出
A week ago, Elvis<- left<- the Building
所以我想替换 Elvis
或 elvis
,因此 str_ireplace
,但在输出中我想以与之前相同的方式显示它。
tldr;
如果要替换的字符串实际大小写不同,如何用相同的大小写字母替换字符串?这有意义吗?
替换字符串只会替换为您提供的任何内容,因此 strireplace
可能不会像您预期的那样工作。
在您的特定用例中,您可以改为手动搜索每个文本词以查找不区分大小写的搜索匹配项,然后像下面这样更新您的文本:
function my_replace(string $fullText, string $searchText){
$searches = explode(' ',$searchText);
$fullText = explode(' ', $fullText);
$result = [];
foreach ($fullText as $word) {
$found = array_filter($searches, function ($search) use ($word) {
return strcasecmp($word, $search) === 0;
}); //If the array is not empty then $found is truthy otherwise its falsey
$result[] = $word.($found ? "<-" : "");
}
return implode(" ", $result);
}
echo my_replace('A week ago, Elvis left the Building', 'elvis left');
这会回显:
A week ago, Elvis<- left<- the Building
示例:http://sandbox.onlinephpfunctions.com/code/3139650b0af1fa30712d05f2453b30b3cf66d5e1
我对你的代码本身做了一些修改,
这 preg_replace 将帮助您解决问题,
片段
function my_replace(string $fullText, string $searchText)
{
$searches = explode(' ', $searchText);
$replace = array();
foreach ($searches as $i => $search) {
$fullText = preg_replace("/$search/i", "$0<-", $fullText);
}
return $fullText;
}
echo my_replace('A week ago, Elvis left the Building', 'elvis left');
这里正在工作demo。
程序输出
A week ago, Elvis<- left<- the Building
我推荐单个 preg_replace()
调用,使用管道搜索字符串、精确的字边界和不区分大小写的标志。
代码:(Demo)
function my_replace (string $fullText, string $searchText) {
$searches = str_replace(' ', '|', $searchText);
return preg_replace("/\b(?:$searches)\b\K/i", "<-", $fullText);
}
echo my_replace('A week ago, Elvis left the Building', 'elvis left');
输出:
A week ago, Elvis<- left<- the Building
\K
重新开始全字符串匹配。如此有效,我告诉 preg_replace()
忘记整个匹配,但记住结束位置——那是 <-
所在的位置。
美妙之处在于,没有迭代函数调用。一次搞定。
p.s。如果您的搜索字符串来自用户或其他不受信任的来源,请使用 preg_quote()
通过转义来保护正则表达式模式。
$searches = str_replace(' ', '|', preg_quote($searchText, "/"));
您似乎喜欢在搜索词后插入'<-',即使大小写不一样,您可以使用以下任何一种:-
使用 preg_match_all 和 preg_replace -
function my_replace(string $fullText, string $searchText){
$searches = explode(' ',$searchText);
$replace = array();
foreach ($searches as $i => $search){
preg_match_all('/'.$search.'/i',$fullText, $matches);
if($matches){
$fullText = preg_replace('/'.$search.'/i', $matches[0][0].'<-', $fullText);
}
}
return $fullText;
}
或者通过获取字符串位置并在计算出的位置插入'<-'
function my_replace(string $fullText, string $searchText){
$searches = explode(' ',$searchText);
$replace = array();
foreach ($searches as $i => $search){
$position = strlen($search)+stripos($fullText, $search);
$fullText = substr_replace($fullText, '<- ', $position, 0);
}
return $fullText;
}
希望对您有所帮助
给定一个由 space 分隔的一个或多个搜索字符串的字符串,我想在不区分大小写的情况下搜索文本中的匹配项。找到匹配项后,我想在匹配的子字符串后立即附加 <-
。
这是我试过的:
代码
public function my_replace(string $fullText, string $searchText){
$searches = explode(' ',$searchText);
$replace = array();
foreach ($searches as $i => $search){
$replace[] = $search . '<-';
}
return str_ireplace($searches, $replace, $fullText);
}
例子
echo my_replace('A week ago, Elvis left the Building', 'elvis left');
输出
A week ago, elvis<- left<- the Building
期望输出
A week ago, Elvis<- left<- the Building
所以我想替换 Elvis
或 elvis
,因此 str_ireplace
,但在输出中我想以与之前相同的方式显示它。
tldr;
如果要替换的字符串实际大小写不同,如何用相同的大小写字母替换字符串?这有意义吗?
替换字符串只会替换为您提供的任何内容,因此 strireplace
可能不会像您预期的那样工作。
在您的特定用例中,您可以改为手动搜索每个文本词以查找不区分大小写的搜索匹配项,然后像下面这样更新您的文本:
function my_replace(string $fullText, string $searchText){
$searches = explode(' ',$searchText);
$fullText = explode(' ', $fullText);
$result = [];
foreach ($fullText as $word) {
$found = array_filter($searches, function ($search) use ($word) {
return strcasecmp($word, $search) === 0;
}); //If the array is not empty then $found is truthy otherwise its falsey
$result[] = $word.($found ? "<-" : "");
}
return implode(" ", $result);
}
echo my_replace('A week ago, Elvis left the Building', 'elvis left');
这会回显:
A week ago, Elvis<- left<- the Building
示例:http://sandbox.onlinephpfunctions.com/code/3139650b0af1fa30712d05f2453b30b3cf66d5e1
我对你的代码本身做了一些修改,
这 preg_replace 将帮助您解决问题,
片段
function my_replace(string $fullText, string $searchText)
{
$searches = explode(' ', $searchText);
$replace = array();
foreach ($searches as $i => $search) {
$fullText = preg_replace("/$search/i", "$0<-", $fullText);
}
return $fullText;
}
echo my_replace('A week ago, Elvis left the Building', 'elvis left');
这里正在工作demo。
程序输出
A week ago, Elvis<- left<- the Building
我推荐单个 preg_replace()
调用,使用管道搜索字符串、精确的字边界和不区分大小写的标志。
代码:(Demo)
function my_replace (string $fullText, string $searchText) {
$searches = str_replace(' ', '|', $searchText);
return preg_replace("/\b(?:$searches)\b\K/i", "<-", $fullText);
}
echo my_replace('A week ago, Elvis left the Building', 'elvis left');
输出:
A week ago, Elvis<- left<- the Building
\K
重新开始全字符串匹配。如此有效,我告诉 preg_replace()
忘记整个匹配,但记住结束位置——那是 <-
所在的位置。
美妙之处在于,没有迭代函数调用。一次搞定。
p.s。如果您的搜索字符串来自用户或其他不受信任的来源,请使用 preg_quote()
通过转义来保护正则表达式模式。
$searches = str_replace(' ', '|', preg_quote($searchText, "/"));
您似乎喜欢在搜索词后插入'<-',即使大小写不一样,您可以使用以下任何一种:-
使用 preg_match_all 和 preg_replace -
function my_replace(string $fullText, string $searchText){
$searches = explode(' ',$searchText);
$replace = array();
foreach ($searches as $i => $search){
preg_match_all('/'.$search.'/i',$fullText, $matches);
if($matches){
$fullText = preg_replace('/'.$search.'/i', $matches[0][0].'<-', $fullText);
}
}
return $fullText;
}
或者通过获取字符串位置并在计算出的位置插入'<-'
function my_replace(string $fullText, string $searchText){
$searches = explode(' ',$searchText);
$replace = array();
foreach ($searches as $i => $search){
$position = strlen($search)+stripos($fullText, $search);
$fullText = substr_replace($fullText, '<- ', $position, 0);
}
return $fullText;
}
希望对您有所帮助