如何使用一个或多个搜索词搜索字符串并在每次匹配后添加字符串?

时间:2018-09-25 12:15:46

标签: php search preg-replace str-replace case-insensitive

给出一个带有一个或多个用空格分隔的搜索字符串的字符串,我想以不区分大小写的方式搜索文本中的匹配项。找到匹配项后,我要在匹配的子字符串后立即附加<-

这是我尝试过的:

代码

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

所以我想替换Elviselvis,也就是str_ireplace,但是在输出端我想用以前的方式显示它。

tldr;

如果要替换的字符串实际上不区分大小写,如何用相同的大小写字母替换字符串?甚至有道理吗?

4 个答案:

答案 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;
}

希望这对您有帮助