Очистить базу данных от тегов HTML / MS Word - PullRequest
3 голосов
/ 11 августа 2011

У меня очень большая база данных для очистки.На старой системе пользователю было разрешено использовать HTML (и вставлять из файлов Word).Теперь у меня есть большое количество открытых тегов в разных местах в БД.

Кто-нибудь знает приложение / скрипт для выполнения такой очистки?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2011

Вы можете сделать это с некоторыми битами php (или другого языка бэкэнда).

Вот пример, написанный на php

$link = mysql_connect($host, $username, $password); //connecting to database 
mysql_select_db($database_name,$link); // select a database
$q = mysql_query('SELECT id_row,cell_with_tags FROM tablename WHERE some_condition_if_it_needed'); 
if(mysql_num_rows($q) !== 0){   //check if result of our query not empty
    while($res = mysql_fetch_assoc($q)){ // gets all rows-cells as associative array
         $result[] = array('id_row'=>$res['id_row'],
                           'cell_with_tags'=>strip_tags($res['cell_with_tags']);
    }
}
if(!empty($result)){ 
    foreach($result as $k=>&$v){ // update our database. Write there values without tags
         mysql_query('UPDATE tablename SET cell_with_tags = '.$result[$k]['cell_with_tags'].' WHERE id='.$result[$k]['id_row']);
    }
}

Вы также можете изменить вызов функции strip_tags, еслиВы хотите удалить не все теги HTML.(http://ru.php.net/manual/en/function.strip-tags.php)

Если выполнение сценария php невозможно, вы можете сделать это только с помощью mysql. Я получаю его из this

DROP FUNCTION IF EXISTS strip_tags || 
CREATE FUNCTION strip_tags( x longtext) RETURNS longtext
LANGUAGE SQL NOT DETERMINISTIC READS SQL DATA 
BEGIN
   DECLARE sstart INT UNSIGNED;
   DECLARE ends INT UNSIGNED;
   SET sstart = LOCATE('<', x, 1);
   REPEAT
      SET ends = LOCATE('>', x, sstart);
      SET x = CONCAT(SUBSTRING( x, 1 ,sstart -1) ,SUBSTRING(x, ends +1 )) ; 
      SET sstart = LOCATE('<', x, 1);
   UNTIL sstart < 1 END REPEAT;
return x;
END;
||
delimiter ;

mysql> SELECT strip_tags('<a href="HelloWorld.html"><B>Hi, mate!</B></a>') as strip_tags;
0 голосов
/ 28 сентября 2012

Что делать, если у вас есть символы <и> как часть текста, а не как часть HTML. Даже если ваша строка содержит неработающий HTML-тег в конце строки. Итак, вы должны использовать эту версию функции:

SET GLOBAL log_bin_trust_function_creators=1;
DROP FUNCTION IF EXISTS fnStripTags;
DELIMITER |
CREATE FUNCTION fnStripTags( Dirty varchar(4096) )
RETURNS varchar(4096)
DETERMINISTIC 
BEGIN
  DECLARE iStart, iEnd, iLength, DirtyLength, DirtyTail int;
  DECLARE iNextLessThenAngleBracket, iLengthToNextLessThenAngleBracket int;
    WHILE Locate( '<', Dirty ) > 0 And Locate( '>', Dirty, Locate( '<', Dirty )) > 0 DO
      BEGIN
        SET iStart = Locate( '<', Dirty ), iEnd = Locate( '>', Dirty, Locate('<', Dirty ));
        SET iNextLessThenAngleBracket = Locate( '<', Dirty, Locate('<', Dirty ) + 1);
        SET iLength = ( iEnd - iStart) + 1;
        SET iLengthToNextLessThenAngleBracket = ( iNextLessThenAngleBracket - iStart) + 1;

        IF iLength < iLengthToNextLessThenAngleBracket THEN
            BEGIN
            IF iLength > 0 THEN
              BEGIN
                SET Dirty = Insert( Dirty, iStart, iLength, '');
              END;
            END IF;
            END;
        ELSE
            BEGIN
                IF iNextLessThenAngleBracket != 0 THEN
                    BEGIN
                        SET Dirty = Insert( Dirty, iStart, 1, '*/*');
                    END;
                ELSE
                    BEGIN
                        SET Dirty = Insert( Dirty, iStart, iLength, '');
                    END;
                END IF;
            END;
        END IF;

      END;
    END WHILE;
    IF Locate( '<', Dirty ) > 0 THEN
        BEGIN
            SET DirtyLength = CHAR_LENGTH(Dirty);
            SET DirtyTail = DirtyLength - Locate( '<', Dirty ) + 1;
            SET Dirty = Insert( Dirty, Locate( '<', Dirty ), DirtyTail, '');
        END;
    END IF;
    BEGIN
        SET Dirty = REPLACE(Dirty, '*/*', '<');
    END;
    RETURN Dirty;
END;
|
DELIMITER ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...