2010-09-09 22 views
17

me preguntaba si hay una función MYSQL para decodificar texto con entidades html. He visto algunos enfoques usando REEMPLAZAR, pero parece un poco difícil administrar todas las entidades.¿hay una función mysql para decodificar entidades html?

+9

El hecho de que pregunte esto implica que usted tiene un error en el diseño de su aplicación. El motor de DB no debería preocuparse por esto, y cambiar la aplicación para que no necesite dicha función es lo correcto. – Tomalak

+8

@Tomalak eso es simplemente ridículo. Que no puedas pensar en un escenario donde uno pueda necesitarlo no significa que no exista. El OP no ha especificado para qué lo está usando, por lo que no puede suponer que está haciendo algo mal. – matteo

+0

@matteo Ni siquiera dije que no podía pensar en semejante escenario. Dije que las cosas están mal cuando te encuentras en ese escenario. Es la situación proverbial de "cuando en un agujero, dejen de cavar". Ese algo - * de alguna manera * - podría ser técnicamente posible no es en absoluto una buena razón para hacerlo. En lugar de reforzar un enfoque nefasto, mi consejo fue que me sentara y obtuviera algo de perspectiva. – Tomalak

Respuesta

7

puede crear la función, como a continuación

DELIMITER $$ 
    DROP FUNCTION IF EXISTS `HTML_UnEncode`$$ 
    CREATE FUNCTION `HTML_UnEncode`(X VARCHAR(255)) RETURNS VARCHAR(255) CHARSET latin1 DETERMINISTIC 
    BEGIN 

    DECLARE TextString VARCHAR(255) ; 
    SET TextString = X ; 

    #quotation mark 
    IF INSTR(X , '"') 
    THEN SET TextString = REPLACE(TextString, '"','"') ; 
    END IF ; 

    #apostrophe 
    IF INSTR(X , ''') 
    THEN SET TextString = REPLACE(TextString, ''','"') ; 
    END IF ; 

    #ampersand 
    IF INSTR(X , '&') 
    THEN SET TextString = REPLACE(TextString, '&','&') ; 
    END IF ; 

    #less-than 
    IF INSTR(X , '<') 
    THEN SET TextString = REPLACE(TextString, '&lt;','<') ; 
    END IF ; 

    #greater-than 
    IF INSTR(X , '&gt;') 
    THEN SET TextString = REPLACE(TextString, '&gt;','>') ; 
    END IF ; 

    #non-breaking space 
    IF INSTR(X , '&nbsp;') 
    THEN SET TextString = REPLACE(TextString, '&nbsp;',' ') ; 
    END IF ; 

    #inverted exclamation mark 
    IF INSTR(X , '&iexcl;') 
    THEN SET TextString = REPLACE(TextString, '&iexcl;','¡') ; 
    END IF ; 

    #cent 
    IF INSTR(X , '&cent;') 
    THEN SET TextString = REPLACE(TextString, '&cent;','¢') ; 
    END IF ; 

    #pound 
    IF INSTR(X , '&pound;') 
    THEN SET TextString = REPLACE(TextString, '&pound;','£') ; 
    END IF ; 

    #currency 
    IF INSTR(X , '&curren;') 
    THEN SET TextString = REPLACE(TextString, '&curren;','¤') ; 
    END IF ; 

    #yen 
    IF INSTR(X , '&yen;') 
    THEN SET TextString = REPLACE(TextString, '&yen;','¥') ; 
    END IF ; 

    #broken vertical bar 
    IF INSTR(X , '&brvbar;') 
    THEN SET TextString = REPLACE(TextString, '&brvbar;','¦') ; 
    END IF ; 

    #section 
    IF INSTR(X , '&sect;') 
    THEN SET TextString = REPLACE(TextString, '&sect;','§') ; 
    END IF ; 

    #spacing diaeresis 
    IF INSTR(X , '&uml;') 
    THEN SET TextString = REPLACE(TextString, '&uml;','¨') ; 
    END IF ; 

    #copyright 
    IF INSTR(X , '&copy;') 
    THEN SET TextString = REPLACE(TextString, '&copy;','©') ; 
    END IF ; 

    #feminine ordinal indicator 
    IF INSTR(X , '&ordf;') 
    THEN SET TextString = REPLACE(TextString, '&ordf;','ª') ; 
    END IF ; 

    #angle quotation mark (left) 
    IF INSTR(X , '&laquo;') 
    THEN SET TextString = REPLACE(TextString, '&laquo;','«') ; 
    END IF ; 

    #negation 
    IF INSTR(X , '&not;') 
    THEN SET TextString = REPLACE(TextString, '&not;','¬') ; 
    END IF ; 

    #soft hyphen 
    IF INSTR(X , '&shy;') 
    THEN SET TextString = REPLACE(TextString, '&shy;','­') ; 
    END IF ; 

    #registered trademark 
    IF INSTR(X , '&reg;') 
    THEN SET TextString = REPLACE(TextString, '&reg;','®') ; 
    END IF ; 

    #spacing macron 
    IF INSTR(X , '&macr;') 
    THEN SET TextString = REPLACE(TextString, '&macr;','¯') ; 
    END IF ; 

    #degree 
    IF INSTR(X , '&deg;') 
    THEN SET TextString = REPLACE(TextString, '&deg;','°') ; 
    END IF ; 

    #plus-or-minus 
    IF INSTR(X , '&plusmn;') 
    THEN SET TextString = REPLACE(TextString, '&plusmn;','±') ; 
    END IF ; 

    #superscript 2 
    IF INSTR(X , '&sup2;') 
    THEN SET TextString = REPLACE(TextString, '&sup2;','²') ; 
    END IF ; 

    #superscript 3 
    IF INSTR(X , '&sup3;') 
    THEN SET TextString = REPLACE(TextString, '&sup3;','³') ; 
    END IF ; 

    #spacing acute 
    IF INSTR(X , '&acute;') 
    THEN SET TextString = REPLACE(TextString, '&acute;','´') ; 
    END IF ; 

    #micro 
    IF INSTR(X , '&micro;') 
    THEN SET TextString = REPLACE(TextString, '&micro;','µ') ; 
    END IF ; 

    #paragraph 
    IF INSTR(X , '&para;') 
    THEN SET TextString = REPLACE(TextString, '&para;','¶') ; 
    END IF ; 

    #middle dot 
    IF INSTR(X , '&middot;') 
    THEN SET TextString = REPLACE(TextString, '&middot;','·') ; 
    END IF ; 

    #spacing cedilla 
    IF INSTR(X , '&cedil;') 
    THEN SET TextString = REPLACE(TextString, '&cedil;','¸') ; 
    END IF ; 

    #superscript 1 
    IF INSTR(X , '&sup1;') 
    THEN SET TextString = REPLACE(TextString, '&sup1;','¹') ; 
    END IF ; 

    #masculine ordinal indicator 
    IF INSTR(X , '&ordm;') 
    THEN SET TextString = REPLACE(TextString, '&ordm;','º') ; 
    END IF ; 

    #angle quotation mark (right) 
    IF INSTR(X , '&raquo;') 
    THEN SET TextString = REPLACE(TextString, '&raquo;','»') ; 
    END IF ; 

    #fraction 1/4 
    IF INSTR(X , '&frac14;') 
    THEN SET TextString = REPLACE(TextString, '&frac14;','¼') ; 
    END IF ; 

    #fraction 1/2 
    IF INSTR(X , '&frac12;') 
    THEN SET TextString = REPLACE(TextString, '&frac12;','½') ; 
    END IF ; 

    #fraction 3/4 
    IF INSTR(X , '&frac34;') 
    THEN SET TextString = REPLACE(TextString, '&frac34;','¾') ; 
    END IF ; 

    #inverted question mark 
    IF INSTR(X , '&iquest;') 
    THEN SET TextString = REPLACE(TextString, '&iquest;','¿') ; 
    END IF ; 

    #multiplication 
    IF INSTR(X , '&times;') 
    THEN SET TextString = REPLACE(TextString, '&times;','×') ; 
    END IF ; 

    #division 
    IF INSTR(X , '&divide;') 
    THEN SET TextString = REPLACE(TextString, '&divide;','÷') ; 
    END IF ; 

    #capital a, grave accent 
    IF INSTR(X , '&Agrave;') 
    THEN SET TextString = REPLACE(TextString, '&Agrave;','À') ; 
    END IF ; 

    #capital a, acute accent 
    IF INSTR(X , '&Aacute;') 
    THEN SET TextString = REPLACE(TextString, '&Aacute;','Á') ; 
    END IF ; 

    #capital a, circumflex accent 
    IF INSTR(X , '&Acirc;') 
    THEN SET TextString = REPLACE(TextString, '&Acirc;','Â') ; 
    END IF ; 

    #capital a, tilde 
    IF INSTR(X , '&Atilde;') 
    THEN SET TextString = REPLACE(TextString, '&Atilde;','Ã') ; 
    END IF ; 

    #capital a, umlaut mark 
    IF INSTR(X , '&Auml;') 
    THEN SET TextString = REPLACE(TextString, '&Auml;','Ä') ; 
    END IF ; 

    #capital a, ring 
    IF INSTR(X , '&Aring;') 
    THEN SET TextString = REPLACE(TextString, '&Aring;','Å') ; 
    END IF ; 

    #capital ae 
    IF INSTR(X , '&AElig;') 
    THEN SET TextString = REPLACE(TextString, '&AElig;','Æ') ; 
    END IF ; 

    #capital c, cedilla 
    IF INSTR(X , '&Ccedil;') 
    THEN SET TextString = REPLACE(TextString, '&Ccedil;','Ç') ; 
    END IF ; 

    #capital e, grave accent 
    IF INSTR(X , '&Egrave;') 
    THEN SET TextString = REPLACE(TextString, '&Egrave;','È') ; 
    END IF ; 

    #capital e, acute accent 
    IF INSTR(X , '&Eacute;') 
    THEN SET TextString = REPLACE(TextString, '&Eacute;','É') ; 
    END IF ; 

    #capital e, circumflex accent 
    IF INSTR(X , '&Ecirc;') 
    THEN SET TextString = REPLACE(TextString, '&Ecirc;','Ê') ; 
    END IF ; 

    #capital e, umlaut mark 
    IF INSTR(X , '&Euml;') 
    THEN SET TextString = REPLACE(TextString, '&Euml;','Ë') ; 
    END IF ; 

    #capital i, grave accent 
    IF INSTR(X , '&Igrave;') 
    THEN SET TextString = REPLACE(TextString, '&Igrave;','Ì') ; 
    END IF ; 

    #capital i, acute accent 
    IF INSTR(X , '&Iacute;') 
    THEN SET TextString = REPLACE(TextString, '&Iacute;','Í') ; 
    END IF ; 

    #capital i, circumflex accent 
    IF INSTR(X , '&Icirc;') 
    THEN SET TextString = REPLACE(TextString, '&Icirc;','Î') ; 
    END IF ; 

    #capital i, umlaut mark 
    IF INSTR(X , '&Iuml;') 
    THEN SET TextString = REPLACE(TextString, '&Iuml;','Ï') ; 
    END IF ; 

    #capital eth, Icelandic 
    IF INSTR(X , '&ETH;') 
    THEN SET TextString = REPLACE(TextString, '&ETH;','Ð') ; 
    END IF ; 

    #capital n, tilde 
    IF INSTR(X , '&Ntilde;') 
    THEN SET TextString = REPLACE(TextString, '&Ntilde;','Ñ') ; 
    END IF ; 

    #capital o, grave accent 
    IF INSTR(X , '&Ograve;') 
    THEN SET TextString = REPLACE(TextString, '&Ograve;','Ò') ; 
    END IF ; 

    #capital o, acute accent 
    IF INSTR(X , '&Oacute;') 
    THEN SET TextString = REPLACE(TextString, '&Oacute;','Ó') ; 
    END IF ; 

    #capital o, circumflex accent 
    IF INSTR(X , '&Ocirc;') 
    THEN SET TextString = REPLACE(TextString, '&Ocirc;','Ô') ; 
    END IF ; 

    #capital o, tilde 
    IF INSTR(X , '&Otilde;') 
    THEN SET TextString = REPLACE(TextString, '&Otilde;','Õ') ; 
    END IF ; 

    #capital o, umlaut mark 
    IF INSTR(X , '&Ouml;') 
    THEN SET TextString = REPLACE(TextString, '&Ouml;','Ö') ; 
    END IF ; 

    #capital o, slash 
    IF INSTR(X , '&Oslash;') 
    THEN SET TextString = REPLACE(TextString, '&Oslash;','Ø') ; 
    END IF ; 

    #capital u, grave accent 
    IF INSTR(X , '&Ugrave;') 
    THEN SET TextString = REPLACE(TextString, '&Ugrave;','Ù') ; 
    END IF ; 

    #capital u, acute accent 
    IF INSTR(X , '&Uacute;') 
    THEN SET TextString = REPLACE(TextString, '&Uacute;','Ú') ; 
    END IF ; 

    #capital u, circumflex accent 
    IF INSTR(X , '&Ucirc;') 
    THEN SET TextString = REPLACE(TextString, '&Ucirc;','Û') ; 
    END IF ; 

    #capital u, umlaut mark 
    IF INSTR(X , '&Uuml;') 
    THEN SET TextString = REPLACE(TextString, '&Uuml;','Ü') ; 
    END IF ; 

    #capital y, acute accent 
    IF INSTR(X , '&Yacute;') 
    THEN SET TextString = REPLACE(TextString, '&Yacute;','Ý') ; 
    END IF ; 

    #capital THORN, Icelandic 
    IF INSTR(X , '&THORN;') 
    THEN SET TextString = REPLACE(TextString, '&THORN;','Þ') ; 
    END IF ; 

    #small sharp s, German 
    IF INSTR(X , '&szlig;') 
    THEN SET TextString = REPLACE(TextString, '&szlig;','ß') ; 
    END IF ; 

    #small a, grave accent 
    IF INSTR(X , '&agrave;') 
    THEN SET TextString = REPLACE(TextString, '&agrave;','à') ; 
    END IF ; 

    #small a, acute accent 
    IF INSTR(X , '&aacute;') 
    THEN SET TextString = REPLACE(TextString, '&aacute;','á') ; 
    END IF ; 

    #small a, circumflex accent 
    IF INSTR(X , '&acirc;') 
    THEN SET TextString = REPLACE(TextString, '&acirc;','â') ; 
    END IF ; 

    #small a, tilde 
    IF INSTR(X , '&atilde;') 
    THEN SET TextString = REPLACE(TextString, '&atilde;','ã') ; 
    END IF ; 

    #small a, umlaut mark 
    IF INSTR(X , '&auml;') 
    THEN SET TextString = REPLACE(TextString, '&auml;','ä') ; 
    END IF ; 

    #small a, ring 
    IF INSTR(X , '&aring;') 
    THEN SET TextString = REPLACE(TextString, '&aring;','å') ; 
    END IF ; 

    #small ae 
    IF INSTR(X , '&aelig;') 
    THEN SET TextString = REPLACE(TextString, '&aelig;','æ') ; 
    END IF ; 

    #small c, cedilla 
    IF INSTR(X , '&ccedil;') 
    THEN SET TextString = REPLACE(TextString, '&ccedil;','ç') ; 
    END IF ; 

    #small e, grave accent 
    IF INSTR(X , '&egrave;') 
    THEN SET TextString = REPLACE(TextString, '&egrave;','è') ; 
    END IF ; 

    #small e, acute accent 
    IF INSTR(X , '&eacute;') 
    THEN SET TextString = REPLACE(TextString, '&eacute;','é') ; 
    END IF ; 

    #small e, circumflex accent 
    IF INSTR(X , '&ecirc;') 
    THEN SET TextString = REPLACE(TextString, '&ecirc;','ê') ; 
    END IF ; 

    #small e, umlaut mark 
    IF INSTR(X , '&euml;') 
    THEN SET TextString = REPLACE(TextString, '&euml;','ë') ; 
    END IF ; 

    #small i, grave accent 
    IF INSTR(X , '&igrave;') 
    THEN SET TextString = REPLACE(TextString, '&igrave;','ì') ; 
    END IF ; 

    #small i, acute accent 
    IF INSTR(X , '&iacute;') 
    THEN SET TextString = REPLACE(TextString, '&iacute;','í') ; 
    END IF ; 

    #small i, circumflex accent 
    IF INSTR(X , '&icirc;') 
    THEN SET TextString = REPLACE(TextString, '&icirc;','î') ; 
    END IF ; 

    #small i, umlaut mark 
    IF INSTR(X , '&iuml;') 
    THEN SET TextString = REPLACE(TextString, '&iuml;','ï') ; 
    END IF ; 

    #small eth, Icelandic 
    IF INSTR(X , '&eth;') 
    THEN SET TextString = REPLACE(TextString, '&eth;','ð') ; 
    END IF ; 

    #small n, tilde 
    IF INSTR(X , '&ntilde;') 
    THEN SET TextString = REPLACE(TextString, '&ntilde;','ñ') ; 
    END IF ; 

    #small o, grave accent 
    IF INSTR(X , '&ograve;') 
    THEN SET TextString = REPLACE(TextString, '&ograve;','ò') ; 
    END IF ; 

    #small o, acute accent 
    IF INSTR(X , '&oacute;') 
    THEN SET TextString = REPLACE(TextString, '&oacute;','ó') ; 
    END IF ; 

    #small o, circumflex accent 
    IF INSTR(X , '&ocirc;') 
    THEN SET TextString = REPLACE(TextString, '&ocirc;','ô') ; 
    END IF ; 

    #small o, tilde 
    IF INSTR(X , '&otilde;') 
    THEN SET TextString = REPLACE(TextString, '&otilde;','õ') ; 
    END IF ; 

    #small o, umlaut mark 
    IF INSTR(X , '&ouml;') 
    THEN SET TextString = REPLACE(TextString, '&ouml;','ö') ; 
    END IF ; 

    #small o, slash 
    IF INSTR(X , '&oslash;') 
    THEN SET TextString = REPLACE(TextString, '&oslash;','ø') ; 
    END IF ; 

    #small u, grave accent 
    IF INSTR(X , '&ugrave;') 
    THEN SET TextString = REPLACE(TextString, '&ugrave;','ù') ; 
    END IF ; 

    #small u, acute accent 
    IF INSTR(X , '&uacute;') 
    THEN SET TextString = REPLACE(TextString, '&uacute;','ú') ; 
    END IF ; 

    #small u, circumflex accent 
    IF INSTR(X , '&ucirc;') 
    THEN SET TextString = REPLACE(TextString, '&ucirc;','û') ; 
    END IF ; 

    #small u, umlaut mark 
    IF INSTR(X , '&uuml;') 
    THEN SET TextString = REPLACE(TextString, '&uuml;','ü') ; 
    END IF ; 

    #small y, acute accent 
    IF INSTR(X , '&yacute;') 
    THEN SET TextString = REPLACE(TextString, '&yacute;','ý') ; 
    END IF ; 

    #small thorn, Icelandic 
    IF INSTR(X , '&thorn;') 
    THEN SET TextString = REPLACE(TextString, '&thorn;','þ') ; 
    END IF ; 

    #small y, umlaut mark 
    IF INSTR(X , '&yuml;') 
    THEN SET TextString = REPLACE(TextString, '&yuml;','ÿ') ; 
    END IF ; 

    RETURN TextString ; 

    END$$ 

    DELIMITER ; 

y ejecutar a continuación consulta:

SELECT HTML_UnEncode('this is a &lt;a&gt;test, nothing more'); 
+0

Estoy leyendo entradas producidas por un (¿con errores?) CKeditor, y también tuve que poner el reemplazo de ampersand en la primera posición, ** también afectando a X ** para que los caracteres como '" é "', que a veces se escapaban como '& agudo'; es decir '# ampersand' ' SI INSTR (X, '&') '' después fijar los TextString = REPLACE (TextString, '&', '&') ; '' set X = REPLACE (X, '&',' &') ; ' 'END IF;' Esto parece anormal comportamiento para mí, así que lo hice sólo se soluciona el error tipográfico producir error en su respuesta, pero no habría mucho sorprendió leer que no soy el único en ese caso la esperanza. esto ayuda. – Balmipour

+0

también tuvo que añadir el apóstrofe. 'SUSTITUIR (TextString, ''', "'")' Esto no se añadió en mi Editar. (_y no estoy seguro de ediciones consecutivas son una buena práctica. es ¿Cómo lo considera la comunidad? _) – Balmipour

+0

falta algo básico ™ como '', '' “, '' ” – billynoah

1

No, no hay ninguna función en MySQL para decodificar las entidades HTML, ya que no tiene que ver con html :)

+10

Pero podría haber ... –

+6

Vota abajo por su no respuesta; seriamente una "respuesta" floja y floja. – John

+0

por qué no, la búsqueda de texto se beneficiaría de dicha función – Kumait

6

La siguiente función se puede utilizar para decodificar entidades numéricas como & # 12345;

CREATE FUNCTION entity_decode(txt TEXT CHARSET utf8) RETURNS TEXT CHARSET utf8 
    NO SQL 
    DETERMINISTIC 
BEGIN 

    DECLARE tmp TEXT CHARSET utf8 DEFAULT txt; 
    DECLARE entity TEXT CHARSET utf8; 
    DECLARE pos1 INT DEFAULT 1; 
    DECLARE pos2 INT; 
    DECLARE codepoint INT; 

    IF txt IS NULL THEN 
     RETURN NULL; 
    END IF; 
    LOOP 
     SET pos1 = LOCATE('&#', tmp, pos1); 
     IF pos1 = 0 THEN 
      RETURN tmp; 
     END IF; 
     SET pos2 = LOCATE(';', tmp, pos1 + 2); 
     IF pos2 > pos1 THEN 
      SET entity = SUBSTRING(tmp, pos1, pos2 - pos1 + 1); 
      IF entity REGEXP '^&#[[:digit:]]+;$' THEN 
       SET codepoint = CAST(SUBSTRING(entity, 3, pos2 - pos1 - 2) AS UNSIGNED); 
       IF codepoint > 31 THEN 
        SET tmp = CONCAT(LEFT(tmp, pos1 - 1), CHAR(codepoint USING utf32), SUBSTRING(tmp, pos2 + 1)); 
       END IF; 
      END IF; 
     END IF; 
     SET pos1 = pos1 + 1; 
    END LOOP; 
END 
+0

MYSQL: error de sintaxis línea 6 – r3wt

+0

Problema del delimitador. Consulte https://stackoverflow.com/a/12796849/584441 – arminrosu

+0

Debe agregar ** DELIMITER $$ ** a la primera línea en su función –

1

Esto añade soporte para codificación hexadecimal valores numéricos (que yo recibo de Perl usando "el uso de HTML :: Entidades qw (encode_entities_numeric);". En cuanto a error en la línea seis, llegué que cuando me encontré en una viuda consulta en MySQL Workbench, pero cuando lo pongo en el diálogo crear función, que funcionaba bien.

CREATE FUNCTION entity_decode(txt TEXT CHARSET utf8) RETURNS TEXT CHARSET utf8 
NO SQL 
DETERMINISTIC 
BEGIN 

DECLARE tmp TEXT CHARSET utf8 DEFAULT txt; 
DECLARE entity TEXT CHARSET utf8; 
DECLARE pos1 INT DEFAULT 1; 
DECLARE pos2 INT; 
DECLARE codepoint INT; 

IF txt IS NULL THEN 
    RETURN NULL; 
END IF; 
LOOP 
    SET pos1 = LOCATE('&#', tmp, pos1); 
    IF pos1 = 0 THEN 
     RETURN tmp; 
    END IF; 
    SET pos2 = LOCATE(';', tmp, pos1 + 2); 
    IF pos2 > pos1 THEN 
     SET entity = SUBSTRING(tmp, pos1, pos2 - pos1 + 1); 
     IF entity REGEXP '^&#[[:digit:]]+;$' THEN 
      SET codepoint = CAST(SUBSTRING(entity, 3, pos2 - pos1 - 2) AS UNSIGNED); 
      IF codepoint > 31 THEN 
       SET tmp = CONCAT(LEFT(tmp, pos1 - 1), CHAR(codepoint USING utf32), SUBSTRING(tmp, pos2 + 1)); 
      END IF; 
     END IF; 
     IF entity REGEXP '^&#x[[:digit:]]+;$' THEN 
      SET codepoint = CAST(CONV(SUBSTRING(entity, 4, pos2 - pos1 - 3), 16, 10) AS UNSIGNED); 
      IF codepoint > 31 THEN 
       SET tmp = CONCAT(LEFT(tmp, pos1 - 1), CHAR(codepoint USING utf32), SUBSTRING(tmp, pos2 + 1)); 
      END IF; 
     END IF; 
    END IF; 
    SET pos1 = pos1 + 1; 
END LOOP; 

FIN

Cuestiones relacionadas