2011-08-11 60 views
3

我有非常大的数据库进行清理。在旧系统上,用户被允许使用HTML(并从Word文件粘贴)。现在我在数据库中的不同位置有大量的开放标签。清理来自HTML/MS Word数据库的数据库

任何人都知道一个应用程序/脚本来执行这种清理?

+0

请澄清要修补现有破碎的HTML标签,或完全移除任何HTML标签 – ajreal

+0

Ajreal嗨。我想完全删除破损的HTML标签 – PsychoX

+0

因此,如果您使用regelure表达式替换标签“”, 之类的东西,think(<\ /?)(\ w +)([^>] *>)可以提供帮助,但不记得是否/如何在mysql中使用regexp替换 –

回答

2

您可以用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

但是如果将'<' and '>'字符作为文本的一部分而不是HTML标记? – Branislav

0

如果你有<和>字符作为文本的一部分,而不是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 ;