如何在MySQL文本字段中查找和替换整个单词?

cl25kdpy  于 2023-05-16  发布在  Mysql
关注(0)|答案(7)|浏览(180)

我有一句话:
“如何从mysql数据库中查找和替换文本中的word?“
和MySQL表的字,以3列id,word和replaceWord。我有超过4000字的数据库。
表:

id     word     replaceWord
 1     text     sentence
 2     word     letter
 3     mysql    MySQL
 4     ..       ...
 5     ..       ...
 6     ..       ...

结果:
“如何从MySQL数据库中查找并替换句子中的字母?“
我知道如何做到这一点,没有数据库,但我需要数据库。

<?php
$text="How to find and replace word in text from mysql database?";
$replaceWord=array(  "text" => "sentence", "word" => "letter", "mysql" => "MySQL");
echo strtr($tekst, $replaceWord);
?>
webghufk

webghufk1#

MySQL 8+

可以使用REGEXP_REPLACE函数:

SELECT REGEXP_REPLACE(the_text,
                      CONCAT('(^|\\W)', text_to_find, '(\\W|$)'),
                      CONCAT('$1', replacement_text, '$2')) AS replaced_text
FROM the_table;

参见this dbfiddle demo

说明:\W是非单词字符的正则表达式语法(反斜杠需要转义,因此为\\W)。或者,^用于文本的开头,$用于文本的结尾。$1$2将这些字符从带括号的捕获组放回替换文本中。

MySQL 8之前版本

如果你不得不使用MySQL的早期版本,这是相当棘手的,但在技术上仍然可以使用自定义编写的正则表达式替换-请参阅此答案的细节。

MariaDB 10.0.5+

正如Paul Spiegel在评论中指出的那样,支持REGEXP_REPLACE的MariaDB版本的唯一区别是使用\\1\\2而不是$1$2来识别捕获组:

SELECT REGEXP_REPLACE(the_text,
                      CONCAT('(^|\\W)', text_to_find, '(\\W|$)'),
                      CONCAT('\\1', replacement_text, '\\2')) AS replaced_text
FROM the_table;

参见this dbfiddle demo

mbskvtky

mbskvtky2#

update YourTable, Words
    set YourTable.YourColumn = replace(YourTable.YourColumn, Words.word, Words.replaceWord)
1cklez4t

1cklez4t3#

select REPLACE(fieldOrString, SearchString, ReplaceString) from table
8dtrkrch

8dtrkrch4#

这里有一个关于可扩展性的糟糕想法:你可以一个字一个字地遍历这个句子,然后在每个句子上查询这个词在‘word’中的位置。如果它确实存在(返回数据),那么用'replaceWord'中的内容进行替换

EDIT:不完全基于数据库,但比您当前的版本更多。

w1jd8yoj

w1jd8yoj5#

//load all replacements
$result = mysql_query("SELECT * FROM YourTableNameHere");
//replace all words
$words = array();
$replacewords =array();
while ($row = mysql_fetch_assoc($result)) {
    $words[] = $row['word'];
    $replacewords[] = $row['replaceword'];
}
$text = str_replace($words,$replacewords);

如果你还需要preg_replace:你必须将列isPattern添加到你的表中,然后你可以这样做:

//load all replacements
$result = mysql_query("SELECT * FROM YourTableNameHere");
//replace all words
$words = array();
$replacewords = array();
$preg_words = array();
$preg_replacewords = array();
while ($row = mysql_fetch_assoc($result)) {
    if(!$row['isPattern']){        
        $words[] = $row['word'];
        $replacewords[] = $row['replaceword'];
    }
    else{
        $preg_words[] = $row['word'];
        $preg_replacewords[] = $row['replaceword'];
    }
}
$text = str_replace($words,$replacewords);
$text = $preg_replace($preg_words,$preg_replacewords);
wdebmtf2

wdebmtf26#

在我开始实现自己的基于answer by @SteveChambers的查询后,我发现每个结果行只发生一次替换。例如,给定OP提到的表记录,此查询:

SELECT 
    word,
    replaceWord,
    REGEXP_REPLACE(
        'How to find and replace word in text from mysql database?', 
        CONCAT('(?i)(^|\\W)', word, '(\\W|$)'),
        CONCAT('\\1', replaceWord, '\\2')
    ) AS replaced_text 
FROM 
    words 
WHERE 
    'How to find and replace word in text from mysql database?' REGEXP CONCAT('(?i)(^|\\W)', word, '(\\W|$)');

将返回不同的3行结果:

word  | replaceWord | replaced_text
------+-------------+--------------
text  | sentence    | How to find and replace letter in text from mysql database?
word  | letter      | How to find and replace word in sentence from mysql database?
mysql | MySQL       | How to find and replace word in text from MySQL database?

请注意,每一行只有一个单词被替换。
经过一番讨论,我们得出结论,需要递归。我成功地实现了这一点,没有一个过程或函数与以下查询:

SELECT 
    (@i := @i + 1) AS i, 
    @tmp := IFNULL(
        REGEXP_REPLACE(
            @tmp, 
            CONCAT('(?i)(^|\\W)', word, '(\\W|$)'), 
            CONCAT('\\1', replaceWord, '\\2')
        ),
        @tmp
    ) AS replaced_text 
FROM 
    (
        SELECT 
            @tmp := 'How to find and replace word in text from mysql database?',
            @i := 0
    ) x
LEFT JOIN 
    words 
ON 
    @tmp REGEXP CONCAT('(?i)(^|\\W)', word, '(\\W|$)') 
ORDER BY i DESC 
LIMIT 1;

此查询递归地替换原始字符串中的每个单词,并累积替换。它使用索引(@i)来对行进行编号。最后,它只返回最后一个结果(更大的索引),其中包含所有累积替换。
它使用LEFT JOINIFNULL组合来返回原始字符串,以防没有进行替换。

ecr0jaav

ecr0jaav7#

$tablesarray包含要搜索的列数组任意单词或字母
$PDO数据库连接

$tablesarray['tablename1']= array('column1' ,'column2' );
    $tablesarray['tablename2']= array('column1' ,'column2' );
    
    $wordstoreplace = ['searchedwordOrLetter1'=>'replacedwordOrLetter1' , 'searchedwordOrLetter2'=>'replacedwordOrLetter2' ]
    foreach($repairkeyarray as $table => $columns){
        foreach($columns as $column){
            foreach($wordstoreplace as $searched => $replaced ){
                $PDO->query("update $table set `$column` = replace(`$column`, '$searched', '$replaced') WHERE `$column` LIKE '%$searched%';");
                @$PDO->execute();
            }
        }
    }

相关问题