3

我有一句话:

“如何从 mysql 数据库中查找和替换文本中的单词?”

和 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);
?>
4

7 回答 7

3
update YourTable, Words
    set YourTable.YourColumn = replace(YourTable.YourColumn, Words.word, Words.replaceWord)
于 2011-01-28T14:32:43.027 回答
3

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;

请参阅此 dbfiddle 演示

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

MySQL 8 之前的版本

如果您被迫使用早期版本的 MySQL,这会非常棘手,但在技术上仍然可以使用自定义编写的正则表达式替换器 - 有关详细信息,请参阅此答案


MariaDB 10.0.5+

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

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

请参阅此 dbfiddle 演示

于 2019-10-30T14:49:26.737 回答
1
//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);
于 2011-01-28T14:35:34.807 回答
0
select REPLACE(fieldOrString, SearchString, ReplaceString) from table
于 2011-01-28T14:30:22.340 回答
0

在可扩展性方面,这是一个糟糕的想法:您可以逐字迭代句子,并在每个单词上查询单词在“单词”中的位置。如果确实存在(返回数据),则用“replaceWord”中的内容进行替换

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

于 2011-01-28T14:30:26.553 回答
0

$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();
            }
        }
    }
于 2020-08-25T08:16:15.257 回答
0

在我开始根据@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 JOIN组合 withIFNULL返回原始字符串。

于 2019-11-01T18:07:47.800 回答