我有一句话:
“如何从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);
?>
7条答案
按热度按时间webghufk1#
MySQL 8+
可以使用
REGEXP_REPLACE
函数:参见this dbfiddle demo。
说明:
\W
是非单词字符的正则表达式语法(反斜杠需要转义,因此为\\W
)。或者,^
用于文本的开头,$
用于文本的结尾。$1
和$2
将这些字符从带括号的捕获组放回替换文本中。MySQL 8之前版本
如果你不得不使用MySQL的早期版本,这是相当棘手的,但在技术上仍然可以使用自定义编写的正则表达式替换-请参阅此答案的细节。
MariaDB 10.0.5+
正如Paul Spiegel在评论中指出的那样,支持
REGEXP_REPLACE
的MariaDB版本的唯一区别是使用\\1
和\\2
而不是$1
和$2
来识别捕获组:参见this dbfiddle demo。
mbskvtky2#
1cklez4t3#
8dtrkrch4#
这里有一个关于可扩展性的糟糕想法:你可以一个字一个字地遍历这个句子,然后在每个句子上查询这个词在‘word’中的位置。如果它确实存在(返回数据),那么用'replaceWord'中的内容进行替换
EDIT:不完全基于数据库,但比您当前的版本更多。
w1jd8yoj5#
如果你还需要preg_replace:你必须将列isPattern添加到你的表中,然后你可以这样做:
wdebmtf26#
在我开始实现自己的基于answer by @SteveChambers的查询后,我发现每个结果行只发生一次替换。例如,给定OP提到的表记录,此查询:
将返回不同的3行结果:
请注意,每一行只有一个单词被替换。
经过一番讨论,我们得出结论,需要递归。我成功地实现了这一点,没有一个过程或函数与以下查询:
此查询递归地替换原始字符串中的每个单词,并累积替换。它使用索引(
@i
)来对行进行编号。最后,它只返回最后一个结果(更大的索引),其中包含所有累积替换。它使用
LEFT JOIN
和IFNULL
组合来返回原始字符串,以防没有进行替换。ecr0jaav7#
$tablesarray包含要搜索的列数组任意单词或字母
$PDO数据库连接