PHP从数据库表中查找并替换文本中的单词

时间:2019-01-21 12:57:02

标签: php string replace

我正在做一个项目。它搜索并替换给定文本中来自数据库的单词。在数据库中有10k个单词和替换单词。因此,我想搜索每个单词并替换该单词的替换单词。

顺便说一句,我正在使用laravel。我只需要替换想法。

我尝试了一些方法,但它仅替换了一个单词。

我的数据库表结构如下;

id单词替换

1次测试

文本来自输入,替换后,我想在结果页中显示替换为不同bg颜色的单词。

我尝试了以下代码,但工作正常,但只能替换一个单词。

\\display.js
function display() {
  for (var i = 0; i < arguments.length; i++) {
    if (typeof arguments[i] === 'object') 
      displayObject(arguments[i])
    else
      displayValue(arguments[i], true)
  }
}

function displayObject(object) {
  if (object == null)
    displayValue('null')
  displayValue(getTypeName(object) + ' {')
  for(var propertyName in object) {
    if (propertyName != 'constructor') {
      displayValue(propertyName + ': ' + object[propertyName], false, true);
    }
  }
  displayValue('}', true)
}

function displayValue(value, addMargin, addPadding) {
  var div = document.createElement('div');
  div.style.fontSize='32px'
  if (addMargin)
    div.style.marginBottom='30px'
  if (addPadding)
    div.style.paddingLeft='30px'
  div.textContent = value;
  document.body.appendChild(div)
}

function getTypeName(object) {
   var funcNameRegex = /function (.{1,})\(/;
   var results = (funcNameRegex).exec(object.constructor.toString());
   return (results && results.length > 1) ? results[1] : "";
}

编辑

我正在使用preg_replace而不是str_replace。我知道它可以工作,但是这次我想显示更改了多少个单词,所以我尝试在替换后从文本中查找更改的单词数量。算错了。

例如,如果有6个更改,则显示3或4

可以通过preg_replace_callback来完成,但是我以前没有使用过,所以我不知道该怎么办。 我的工作代码如下;

    $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);

2 个答案:

答案 0 :(得分:0)

我很困惑,您是否不需要$ word [replacement]周围的<?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 ;

答案 1 :(得分:0)

正如其他人在评论中所建议的那样,似乎$content的值在foreach循环的每次运行中均被覆盖,而较旧的迭代将被忽略。这是因为str_replace的第三个参数是$article,即未经修改的原始文本。因此,结果只有最后一个字出现。

解决此问题的最简单方法是在foreach循环之前声明$content,然后使$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);
}