Как найти строку, используя одно или несколько поисковых слов, и добавить строку после каждого совпадения? - PullRequest
0 голосов
/ 25 сентября 2018

Учитывая строку с одной или несколькими поисковыми строками, разделенными пробелом, я бы хотел поиск совпадений в тексте без учета регистра.Когда совпадение найдено, я хочу добавить <- сразу после совпавшей подстроки.

Вот что я пробовал:

Код

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;

Как заменить строку той же самой буквой, если строка для замены на самом деле не та же самая?Имеет ли это смысл?

Ответы [ 4 ]

0 голосов
/ 25 сентября 2018

Похоже, вам нравится вставлять '<-' после искомого слова, даже если регистр не совпадает, возможно, вы можете использовать любое из следующего: - </p>

с использованием 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;
}

Или, получив строковую позицию и вставив '<-' в вычисленную позицию </p>

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

Надеюсь, это поможет вам

0 голосов
/ 25 сентября 2018

Я сделал некоторые изменения в самом коде,

Это 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 .

Выход программы

Неделю назад Элвис <- слева <- здание </p>

0 голосов
/ 25 сентября 2018

Я рекомендую один вызов 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() забыть все совпадения, но помнить конечную позицию - вот куда идет <-.

Прелесть в том, что нет повторных вызовов функций.Все это делается за один проход.

ps, если строки поиска исходят от пользователей или других ненадежных источников, используйте preg_quote() для защиты шаблона регулярных выражений с экранированием.

$searches = str_replace(' ', '|', preg_quote($searchText, "/"));
0 голосов
/ 25 сентября 2018

Замена строки просто заменит все, что вы ей предоставили, поэтому 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');

Это должно повториться:

Неделю назад, Элвис <- слева <- здание </p>

Пример: http://sandbox.onlinephpfunctions.com/code/3139650b0af1fa30712d05f2453b30b3cf66d5e1

...