给出一个带有一个或多个用空格分隔的搜索字符串的字符串,我想以不区分大小写的方式搜索文本中的匹配项。找到匹配项后,我要在匹配的子字符串后立即附加<-
。
这是我尝试过的:
代码
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;
如果要替换的字符串实际上不区分大小写,如何用相同的大小写字母替换字符串?甚至有道理吗?
答案 0 :(得分:4)
我已经对您的代码本身进行了修改,
此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。
程序输出
一周前,猫王<-离开<-建筑物
答案 1 :(得分:3)
替换字符串将仅替换为您提供的字符串,因此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');
这会回声:
一周前,猫王<-离开<-建筑物
示例:http://sandbox.onlinephpfunctions.com/code/3139650b0af1fa30712d05f2453b30b3cf66d5e1
答案 2 :(得分:0)
我建议您进行一次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, "/"));
答案 3 :(得分:-1)
似乎您喜欢在搜索到的单词后插入“ <-”,即使大小写不同也可以,您可以使用以下任意一种:-
使用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;
}
希望这对您有帮助