我正在做一个项目。它搜索并替换给定文本中来自数据库的单词。在数据库中有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);
答案 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);
}