Miglior modo per togliere i tag html da una stringa in sql server?

Ho dati in SQL Server 2005 che contiene i tag html e vorrei togliere tutti che fuori, lasciando solo il testo tra i tag. Idealmente anche la sostituzione cose come &lt; con <, etc.

C’è un modo semplice per fare questo o qualcuno ha già avuto qualche esempio di codice t-sql?

Non ho la possibilità di aggiungere extended stored procedure e simili, quindi preferirei un puro t-sql approccio (preferibilmente compatibile con sql 2000).

Voglio solo recuperare i dati con estratto di html, non aggiornarlo, così idealmente dovrebbe essere scritto come una funzione definita dall’utente, per un facile riutilizzo.

Così, per esempio, la conversione di questo:

<B>Some useful text</B>&nbsp;
<A onclick="return openInfo(this)"
   href="http://there.com/3ce984e88d0531bac5349"
   target=globalhelp>
   <IMG title="Source Description" height=15 alt="Source Description" 
        src="/ri/new_info.gif" width=15 align=top border=0>
</A>&gt;&nbsp;<b>more text</b></TD></TR>

a questo:

Some useful text > more text
InformationsquelleAutor Rory | 2009-01-19



8 Replies
  1. 149

    C’è un UDF che sarà descritto qui:

    La Funzione Definita dall’utente per la Striscia di HTML

    CREATE FUNCTION [dbo].[udf_StripHTML] (@HTMLText VARCHAR(MAX))
    RETURNS VARCHAR(MAX) AS
    BEGIN
        DECLARE @Start INT
        DECLARE @End INT
        DECLARE @Length INT
        SET @Start = CHARINDEX('<',@HTMLText)
        SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText))
        SET @Length = (@End - @Start) + 1
        WHILE @Start > 0 AND @End > 0 AND @Length > 0
        BEGIN
            SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'')
            SET @Start = CHARINDEX('<',@HTMLText)
            SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText))
            SET @Length = (@End - @Start) + 1
        END
        RETURN LTRIM(RTRIM(@HTMLText))
    END
    GO

    Edit: nota questo è per SQL Server 2005, ma se si cambia la chiave MAX a qualcosa come 4000, in SQL Server 2000.

    • Grande, grazie. Commenti link a una versione migliorata: lazycoders.blogspot.com/2007/06/… che si occupa più in entità html.
    • Nota che come una stringa-per la cpu UDF in SQL Server 2005 o versione successiva questo è un candidato ideale per l’implementazione di un CLR UDF funzione per un massiccio incremento delle prestazioni. Ulteriori informazioni su come farlo qui: stackoverflow.com/questions/34509/…
    • Nota il lazycoders post ha due errori di battitura. Rimuovere le virgolette da tutto il CHAR(13) + CHAR(10) in due sezioni che sono questi. Abbastanza sottile non ho capito finché non ha superato la lunghezza di un campo corto (è interessante notare che, e necessario per me, tutte le sostituzioni sono più brevi rispetto alla stringa originale).
    • Che cosa circa codificato in formato html valori? avrebbe bisogno decodificato. Grazie.
    • Ho usato il lazycoders, più il fix errore di battitura da @goodeye sopra funziona alla grande. Per risparmiare tempo, lazycoders blog versione è qui: lazycoders.blogspot.com/2007/06/…
    • Questo ha funzionato per me dopo che ho utilizzato è di tipo nvarchar invece di tipo varchar perché io uso i caratteri unicode nei tag html
    • Perché SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText)) ricalcolare CHARINDEX('<',@HTMLText) invece di riutilizzare @Start, che è appena stato calcolato che esattamente la stessa cosa della precedente affermazione?
    • nessuna buona ragione – si potrebbe ottimizzare la
    • Ciò non toglie Embedded Stili CSS.

  2. 14

    Derivati da @Goner Doug risposta, con un paio di cose aggiornamento:

    – utilizzo di SOSTITUIRE, dove possibile,

    – conversione di entità predefinite come &eacute; (io ho scelto quelli che mi serviva 🙂

    – alcuni di conversione dell’elenco di tag <ul> and <li>

    ALTER FUNCTION [dbo].[udf_StripHTML]
    --by Patrick Honorez --- www.idevlop.com
    --inspired by http://stackoverflow.com/questions/457701/best-way-to-strip-html-tags-from-a-string-in-sql-server/39253602#39253602
    (
    @HTMLText varchar(MAX)
    )
    RETURNS varchar(MAX)
    AS
    BEGIN
    DECLARE @Start  int
    DECLARE @End    int
    DECLARE @Length int
    
    set @HTMLText = replace(@htmlText, '<br>',CHAR(13) + CHAR(10))
    set @HTMLText = replace(@htmlText, '<br/>',CHAR(13) + CHAR(10))
    set @HTMLText = replace(@htmlText, '<br />',CHAR(13) + CHAR(10))
    set @HTMLText = replace(@htmlText, '<li>','- ')
    set @HTMLText = replace(@htmlText, '</li>',CHAR(13) + CHAR(10))
    
    set @HTMLText = replace(@htmlText, '&rsquo;' collate Latin1_General_CS_AS, ''''  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&quot;' collate Latin1_General_CS_AS, '"'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&amp;' collate Latin1_General_CS_AS, '&'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&euro;' collate Latin1_General_CS_AS, '€'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&lt;' collate Latin1_General_CS_AS, '<'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&gt;' collate Latin1_General_CS_AS, '>'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&oelig;' collate Latin1_General_CS_AS, 'oe'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&nbsp;' collate Latin1_General_CS_AS, ' '  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&copy;' collate Latin1_General_CS_AS, '©'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&laquo;' collate Latin1_General_CS_AS, '«'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&reg;' collate Latin1_General_CS_AS, '®'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&plusmn;' collate Latin1_General_CS_AS, '±'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&sup2;' collate Latin1_General_CS_AS, '²'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&sup3;' collate Latin1_General_CS_AS, '³'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&micro;' collate Latin1_General_CS_AS, 'µ'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&middot;' collate Latin1_General_CS_AS, '·'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&ordm;' collate Latin1_General_CS_AS, 'º'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&raquo;' collate Latin1_General_CS_AS, '»'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&frac14;' collate Latin1_General_CS_AS, '¼'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&frac12;' collate Latin1_General_CS_AS, '½'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&frac34;' collate Latin1_General_CS_AS, '¾'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&Aelig' collate Latin1_General_CS_AS, 'Æ'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&Ccedil;' collate Latin1_General_CS_AS, 'Ç'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&Egrave;' collate Latin1_General_CS_AS, 'È'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&Eacute;' collate Latin1_General_CS_AS, 'É'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&Ecirc;' collate Latin1_General_CS_AS, 'Ê'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&Ouml;' collate Latin1_General_CS_AS, 'Ö'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&agrave;' collate Latin1_General_CS_AS, 'à'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&acirc;' collate Latin1_General_CS_AS, 'â'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&auml;' collate Latin1_General_CS_AS, 'ä'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&aelig;' collate Latin1_General_CS_AS, 'æ'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&ccedil;' collate Latin1_General_CS_AS, 'ç'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&egrave;' collate Latin1_General_CS_AS, 'è'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&eacute;' collate Latin1_General_CS_AS, 'é'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&ecirc;' collate Latin1_General_CS_AS, 'ê'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&euml;' collate Latin1_General_CS_AS, 'ë'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&icirc;' collate Latin1_General_CS_AS, 'î'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&ocirc;' collate Latin1_General_CS_AS, 'ô'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&ouml;' collate Latin1_General_CS_AS, 'ö'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&divide;' collate Latin1_General_CS_AS, '÷'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&oslash;' collate Latin1_General_CS_AS, 'ø'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&ugrave;' collate Latin1_General_CS_AS, 'ù'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&uacute;' collate Latin1_General_CS_AS, 'ú'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&ucirc;' collate Latin1_General_CS_AS, 'û'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&uuml;' collate Latin1_General_CS_AS, 'ü'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&quot;' collate Latin1_General_CS_AS, '"'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&amp;' collate Latin1_General_CS_AS, '&'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&lsaquo;' collate Latin1_General_CS_AS, '<'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&rsaquo;' collate Latin1_General_CS_AS, '>'  collate Latin1_General_CS_AS)
    
    
    -- Remove anything between <STYLE> tags
    SET @Start = CHARINDEX('<STYLE', @HTMLText)
    SET @End = CHARINDEX('</STYLE>', @HTMLText, CHARINDEX('<', @HTMLText)) + 7
    SET @Length = (@End - @Start) + 1
    
    WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
    SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
    SET @Start = CHARINDEX('<STYLE', @HTMLText)
    SET @End = CHARINDEX('</STYLE>', @HTMLText, CHARINDEX('</STYLE>', @HTMLText)) + 7
    SET @Length = (@End - @Start) + 1
    END
    
    -- Remove anything between <whatever> tags
    SET @Start = CHARINDEX('<', @HTMLText)
    SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
    SET @Length = (@End - @Start) + 1
    
    WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
    SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
    SET @Start = CHARINDEX('<', @HTMLText)
    SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
    SET @Length = (@End - @Start) + 1
    END
    
    RETURN LTRIM(RTRIM(@HTMLText))
    
    END
    • Ho usato questo e l’amore, ma l’ho fatto aggiungere un altro per sostituire il gruppo di testa: </p> ho cambiato un char 13 + char 10 anche dopo la fine di un tag di paragrafo di solito indica una nuova linea. Ha funzionato perfettamente nel mio scenario di particolare
  3. 8

    Se il codice HTML è corretto, penso che questa sia una soluzione migliore:

    create function dbo.StripHTML( @text varchar(max) ) returns varchar(max) as
    begin
        declare @textXML xml
        declare @result varchar(max)
        set @textXML = REPLACE( @text, '&', '' );
        with doc(contents) as
        (
            select chunks.chunk.query('.') from @textXML.nodes('/') as chunks(chunk)
        )
        select @result = contents.value('.', 'varchar(max)') from doc
        return @result
    end
    go
    
    select dbo.StripHTML('This <i>is</i> an <b>html</b> test')
    • Questo ha funzionato per me. +1. Ma per favore, potresti spiegare il tuo codice, in modo che gli sviluppatori di comprendere più facilmente? 🙂
    • sembra che carichi il codice html di un documento xml che poi seleziona tutti i valori al di fuori di esso. Nota: questo codice pukes su &nbsp;
    • Mettere un hack per non bombardamenti sui codici HTML. Ovviamente è solo un rapido hack per usi interni o qualsiasi altra cosa (come accettato UDF).
    • Deve essere ben formato, quindi non è fault tolerant come RedFilter s.
    • HTML non è un sottoinsieme di XML. XHTML è, ma l’HTML non è diretto verso la strada più.
  4. 7

    Ecco una versione aggiornata di questa funzione che incorpora la RedFilter risposta (Pinal originale) con il LazyCoders aggiunte e le goodeye errore di battitura correzioni E mia, oltre a gestire in linea <STYLE> all’interno del tag HTML.

    ALTER FUNCTION [dbo].[udf_StripHTML]
    (
    @HTMLText varchar(MAX)
    )
    RETURNS varchar(MAX)
    AS
    BEGIN
    DECLARE @Start  int
    DECLARE @End    int
    DECLARE @Length int
    
    -- Replace the HTML entity &amp; with the '&' character (this needs to be done first, as
    -- '&' might be double encoded as '&amp;amp;')
    SET @Start = CHARINDEX('&amp;', @HTMLText)
    SET @End = @Start + 4
    SET @Length = (@End - @Start) + 1
    
    WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
    SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '&')
    SET @Start = CHARINDEX('&amp;', @HTMLText)
    SET @End = @Start + 4
    SET @Length = (@End - @Start) + 1
    END
    
    -- Replace the HTML entity &lt; with the '<' character
    SET @Start = CHARINDEX('&lt;', @HTMLText)
    SET @End = @Start + 3
    SET @Length = (@End - @Start) + 1
    
    WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
    SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '<')
    SET @Start = CHARINDEX('&lt;', @HTMLText)
    SET @End = @Start + 3
    SET @Length = (@End - @Start) + 1
    END
    
    -- Replace the HTML entity &gt; with the '>' character
    SET @Start = CHARINDEX('&gt;', @HTMLText)
    SET @End = @Start + 3
    SET @Length = (@End - @Start) + 1
    
    WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
    SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '>')
    SET @Start = CHARINDEX('&gt;', @HTMLText)
    SET @End = @Start + 3
    SET @Length = (@End - @Start) + 1
    END
    
    -- Replace the HTML entity &amp; with the '&' character
    SET @Start = CHARINDEX('&amp;amp;', @HTMLText)
    SET @End = @Start + 4
    SET @Length = (@End - @Start) + 1
    
    WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
    SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '&')
    SET @Start = CHARINDEX('&amp;amp;', @HTMLText)
    SET @End = @Start + 4
    SET @Length = (@End - @Start) + 1
    END
    
    -- Replace the HTML entity &nbsp; with the ' ' character
    SET @Start = CHARINDEX('&nbsp;', @HTMLText)
    SET @End = @Start + 5
    SET @Length = (@End - @Start) + 1
    
    WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
    SET @HTMLText = STUFF(@HTMLText, @Start, @Length, ' ')
    SET @Start = CHARINDEX('&nbsp;', @HTMLText)
    SET @End = @Start + 5
    SET @Length = (@End - @Start) + 1
    END
    
    -- Replace any <br> tags with a newline
    SET @Start = CHARINDEX('<br>', @HTMLText)
    SET @End = @Start + 3
    SET @Length = (@End - @Start) + 1
    
    WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
    SET @HTMLText = STUFF(@HTMLText, @Start, @Length, CHAR(13) + CHAR(10))
    SET @Start = CHARINDEX('<br>', @HTMLText)
    SET @End = @Start + 3
    SET @Length = (@End - @Start) + 1
    END
    
    -- Replace any <br/> tags with a newline
    SET @Start = CHARINDEX('<br/>', @HTMLText)
    SET @End = @Start + 4
    SET @Length = (@End - @Start) + 1
    
    WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
    SET @HTMLText = STUFF(@HTMLText, @Start, @Length, CHAR(13) + CHAR(10))
    SET @Start = CHARINDEX('<br/>', @HTMLText)
    SET @End = @Start + 4
    SET @Length = (@End - @Start) + 1
    END
    
    -- Replace any <br /> tags with a newline
    SET @Start = CHARINDEX('<br />', @HTMLText)
    SET @End = @Start + 5
    SET @Length = (@End - @Start) + 1
    
    WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
    SET @HTMLText = STUFF(@HTMLText, @Start, @Length, CHAR(13) + CHAR(10))
    SET @Start = CHARINDEX('<br />', @HTMLText)
    SET @End = @Start + 5
    SET @Length = (@End - @Start) + 1
    END
    
    -- Remove anything between <STYLE> tags
    SET @Start = CHARINDEX('<STYLE', @HTMLText)
    SET @End = CHARINDEX('</STYLE>', @HTMLText, CHARINDEX('<', @HTMLText)) + 7
    SET @Length = (@End - @Start) + 1
    
    WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
    SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
    SET @Start = CHARINDEX('<STYLE', @HTMLText)
    SET @End = CHARINDEX('</STYLE>', @HTMLText, CHARINDEX('</STYLE>', @HTMLText)) + 7
    SET @Length = (@End - @Start) + 1
    END
    
    -- Remove anything between <whatever> tags
    SET @Start = CHARINDEX('<', @HTMLText)
    SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
    SET @Length = (@End - @Start) + 1
    
    WHILE (@Start > 0 AND @End > 0 AND @Length > 0) BEGIN
    SET @HTMLText = STUFF(@HTMLText, @Start, @Length, '')
    SET @Start = CHARINDEX('<', @HTMLText)
    SET @End = CHARINDEX('>', @HTMLText, CHARINDEX('<', @HTMLText))
    SET @Length = (@End - @Start) + 1
    END
    
    RETURN LTRIM(RTRIM(@HTMLText))
    
    END
    • Per mia informazione, qualsiasi motivo, l’uso STUFF() invece di REPLACE() (che sarebbe poltiglia più breve IMO) ?
    • Non avevo proprio pensato. Ho semplicemente copiato, modificato, originale, come indicato. Sostituire potrebbe molto bene essere un’opzione migliore. Mi chiedo se ci sia un confronto di prestazioni tra le due funzioni da considerare…
    • applausi per questo, leggendo attraverso accettati commenti come questo in realtà ha bisogno di un aggiornamento.
  5. 4

    Questa non è una nuova e completa soluzione, ma una correzione per afwebservant‘s soluzione:

    --note comments to see the corrections
    
    CREATE FUNCTION [dbo].[StripHTML] (@HTMLText VARCHAR(MAX))  
    RETURNS VARCHAR(MAX)  
    AS  
    BEGIN  
     DECLARE @Start  INT  
     DECLARE @End    INT  
     DECLARE @Length INT  
     --DECLARE @TempStr varchar(255) (this is not used)  
    
     SET @Start = CHARINDEX('<',@HTMLText)  
     SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText))  
     SET @Length = (@End - @Start) + 1  
    
     WHILE @Start > 0 AND @End > 0 AND @Length > 0  
     BEGIN  
       IF (UPPER(SUBSTRING(@HTMLText, @Start, 4)) <> '<BR>') AND (UPPER(SUBSTRING(@HTMLText, @Start, 5)) <> '</BR>')  
        begin  
          SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'')  
          end  
    -- this ELSE and SET is important
       ELSE  
          SET @Length = 0;  
    
    -- minus @Length here below is important
       SET @Start = CHARINDEX('<',@HTMLText, @End-@Length)  
       SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText, @Start))  
    -- instead of -1 it should be +1
       SET @Length = (@End - @Start) + 1  
     END  
    
     RETURN RTRIM(LTRIM(@HTMLText))  
    END  
    • Questo ha funzionato per me dopo che ho utilizzato è di tipo nvarchar invece di tipo varchar perché io uso i caratteri unicode all’interno di tag html
  6. 3

    Provare questo. È una versione modificata di quello pubblicato dal RedFilter … questo SQL rimuove tutte le modifiche tranne BR, B, e P con accompagnamento attributi:

    CREATE FUNCTION [dbo].[StripHtml] (@HTMLText VARCHAR(MAX))
    RETURNS VARCHAR(MAX)
    AS
    BEGIN
     DECLARE @Start  INT
     DECLARE @End    INT
     DECLARE @Length INT
     DECLARE @TempStr varchar(255)
    
     SET @Start = CHARINDEX('<',@HTMLText)
     SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText))
     SET @Length = (@End - @Start) + 1
    
     WHILE @Start > 0 AND @End > 0 AND @Length > 0
     BEGIN
       IF (UPPER(SUBSTRING(@HTMLText, @Start, 3)) <> '<BR') AND (UPPER(SUBSTRING(@HTMLText, @Start, 2)) <> '<P') AND (UPPER(SUBSTRING(@HTMLText, @Start, 2)) <> '<B') AND (UPPER(SUBSTRING(@HTMLText, @Start, 3)) <> '</B')
       BEGIN
          SET @HTMLText = STUFF(@HTMLText,@Start,@Length,'')
       END
    
       SET @Start = CHARINDEX('<',@HTMLText, @End)
       SET @End = CHARINDEX('>',@HTMLText,CHARINDEX('<',@HTMLText, @Start))
       SET @Length = (@End - @Start) - 1
     END
    
     RETURN RTRIM(LTRIM(@HTMLText))
    END
    • non ha funzionato per me SELECT dbo.StripHtml(‘<b>somestuff</b>’); restituisce la stringa esatta
    • questo è previsto. Controllare prima riga della risposta (“SQL rimuove tutte le modifiche tranne BR, B, e P con accompagnamento attributi”).
    • questa funzione SQL non è corretto. Si prega di fare riferimento alla risposta qui sotto per la funzione corretta.
    • l’utilizzo di “sotto” e “sopra” come un punto di riferimento per dove trovare risposte in un MODO che la pagina è priva di senso, perché l’ordine di risposta può essere modificato utilizzando le schede nella parte superiore (e non di più, il diritto di voto può cambiare l’ordine di risposta). Si prega di specificare una risposta utilizzando il nome dell’autore di distacco
  7. 2

    Come sull’utilizzo di XQuery con una fodera:

    DECLARE @MalformedXML xml, @StrippedText varchar(max)
    SET @MalformedXML = @xml.query('for $x in //. return ($x)//text()')
    SET @StrippedText = CAST(@MalformedXML as varchar(max))

    Questo scorre tutti gli elementi e restituisce il testo() solo.

    Per evitare di testo tra gli elementi concatenazione senza spazi, utilizzare:

    DECLARE @MalformedXML xml, @StrippedText varchar(max)
    SET @MalformedXML = @xml.query('for $x in //. return concat((($x)//text())[1]," ")')
    SET @StrippedText = CAST(@MalformedXML as varchar(max))

    E a rispondere al “Come si fa a usare questo per una colonna:

      SELECT CAST(html_column.query('for $x in //. return concat((($x)//text()) as varchar(max))
      FROM table

    Per il codice di cui sopra, assicurarsi che il html_column è di tipo di dati xml, se non, è necessario salvare una fusione versione di html come xml. Vorrei fare questo come un esercizio separato al momento del caricamento dei dati di HTML, SQL genererà un errore se non trova xml non valido, ad esempio, non corrispondenti inizio/fine tag, caratteri non validi.

    Questi sono ottimi per quando si vuole costruire seachh frasi, striscia di HTML, etc.

    Basta notare che questo restituisce tipo xml, espressi o latenti, di testo, ove appropriato. La versione di xml di questo tipo di dati è inutile, in quanto non è un XML ben formato.

    • Senza la vera soluzione a un cast da xml mi sento come questo è al più una soluzione parziale.
    • CAST(@xml come varchar(max)). O la CONVERSIONE(xml), @XML). Ritenere che la maggior parte degli sviluppatori a capire che fuori.
    • Sicuramente è ragionevole supporre che gli sviluppatori sanno come cast, ma tenete a mente che qualcuno leggendo la tua risposta non può vedere direttamente che “semplicemente” il casting è tutto ciò che deve essere fatto. Soprattutto perché non è detto che possiamo cast dove appropriato. — Io non sto cercando di essere negativo, solo spero che questo ti aiuta nella creazione di risposte che sono più facili da riconoscere come utili!
    • In modo che parte di questo è il nome della colonna? Diciamo che ho una tabella chiamata data con una colonna denominata html e voglio selezionare tutti i valori nella colonna, ma la striscia di tag html come potrei utilizzare la tua risposta per ottenere che?
  8. 0

    Patrick Honorez codice ha bisogno di un leggero cambiamento.

    Restituisce risultati incompleti html che contiene &lt; o &gt;

    Questo perché il codice sotto la sezione

    — Remove nulla tra i tag

    sarà, infatti, sostituire il < > per nulla. La correzione è quello di applicare le seguenti due righe:

    set @HTMLText = replace(@htmlText, '&lt;' collate Latin1_General_CS_AS, '<'  collate Latin1_General_CS_AS)
    set @HTMLText = replace(@htmlText, '&gt;' collate Latin1_General_CS_AS, '>'  collate Latin1_General_CS_AS)

Lascia un commento