Php найти и заменить слова в тексте из таблиц базы данных - PullRequest
0 голосов
/ 21 января 2019

Я работаю над проектом.Он ищет и заменяет слова из базы данных в заданном тексте.В базе данных есть 10 тыс. Слов и замен.Поэтому я хочу найти каждое слово и заменить слово для замены.

Кстати, я использую laravel.Мне нужны только идеи замены.

Я пробовал несколько способов, но он заменяет только одно слово.

Моя структура таблицы базы данных, как показано ниже;

Замена слова идентификатора

1 тестовое тестирование

и т. Д.

Текст поступает с ввода, и после замены я хочу показать, какие слова заменяются другим цветом bg на странице результатов.

Я попробовал приведенные ниже коды, работающие нормально, но он заменяет только одно слово.

    $article = trim(strip_tags($request->article));
    $clean = preg_split('/[\s]+/', $article);
    $word_count = count($clean);
    $words_from_database_for_search = Words::all();
    foreach($words_from_database_for_search as $word){
        $content = str_replace($word['word'],
            "<span class=\"badge badge-success\">$word[replacement] 
    </span>",
            $article);
    }
    $new_content = $content ;
    $new_content_clean = preg_split('/[\s]+/', $new_content);
    $new_content_word_count= count($new_content_clean);

Edit,

Я использую preg_replace вместо str_replace.У меня получилось, но на этот раз я хочу показать, сколько слов изменилось, поэтому я попытался найти количество измененных слов в тексте после замены.Это считается неправильным.

Пример, если есть 6 изменений, это показывает 3 или 4

Это может быть сделано через preg_replace_callback, но я не использовал его раньше, поэтому я не знаю, как выяснить;Мои рабочие коды приведены ниже;

    $old_article = trim(strip_tags($request->article));
    $old_article_word_count = count($old_article );
    $words_from_database_array= Words::all();
    $article_will_replace = trim(strip_tags($request->article));
    $count_the_replaced_words = 0;
    foreach($words_from_database_array as $word){

        $article_will_replace = preg_replace('/[^a-zA- 
    ZğüşıöçĞÜŞİÖÇ]\b'.$word['word'].'\b\s/u',
            " <b>".$word['spin']."</b> ",
            $article_will_replace );

        $count_the_replaced_words = preg_match_all('/[^a-zA- 
ZğüşıöçĞÜŞİÖÇ]\b'.strip_tags($word['spin']).'\b\s/u',$article_will_replace 
     );
        if($count_the_replaced_words ){

            $count_the_replaced_words ++;

        }



    }

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Как и другие предлагали в комментариях, кажется, что ваше значение $content перезаписывается при каждом запуске цикла foreach, а более старые итерации игнорируются. Это потому, что третий аргумент вашего str_replace - это $article, оригинальный, неизмененный текст. Поэтому только последнее слово отображается в результате.

Самый простой способ исправить это - объявить $content перед циклом foreach, а затем сделать $content третьим аргументом цикла foreach, чтобы он непрерывно заменялся новым словом на каждой итерации, например, так :

$content = $article;
foreach($words_from_database_for_search as $word){
    $content = str_replace($word['word'],
        "<span class=\"badge badge-success\">$word[replacement]</span>",
        $content);
}
0 голосов
/ 21 января 2019

Я в замешательстве, вам не нужно <?php ... ?> вокруг слова $ [замена]?

    foreach($words_from_database_for_search as $word){
        $content = str_replace($word['word'],
            "<span class=\"badge badge-success\"><?PHP $word[replacement] ?> 
    </span>",
            $article);
    }

, а затем переместите это в цикл for и добавьте точку перед знаком равенства:

$new_content .= $content ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...