• asp中如何去掉HTML标记 [返回文章列表]     发表于: 12/3/2008  756人(次)浏览
  • 引用地址:http://www.xici.net/b231526/d34199639.htm
    有一段代码如:<a href="/Shop_Cart.asp">购物车</a><img src="/images/Spacer.gif" width="43" height="5">  
                      <a href="/Shop_Banking.asp">收银台</a><img src="/images/Spacer.gif" width="46" height="5">  
                      <a href="/help.asp">服务台</a><img src="/images/Spacer.gif" width="39" height="5">  
                      <a href="/Vip_home.asp">会员中心</a><img src="/images/Spacer.gif" width="2" height="5" border="0"> 
        

       怎样才能在asp中把其中的HTML标记去掉?只保留其中的文字(购物车,收银台等)? 

    --------------------------------------------------------------------------- 

    方法一 : 禁用HTML 
    最简单的方法是直接禁用html标签而不用移除它们. 可以使用Replace()函数. 例如: 

    strText = Replace(strText, "<script", "&lt;script", 1, -1, 1) 

    或者直接禁用所有的html:  
    strText = Replace(strText, "<", "&lt;") 

    这样做虽然很安全,但显得不够友好.(用户提交的文本会变得难以阅读)  

    方法二: 使用"<"和">" 
    怎样使得html标签从文本中消失呢? 我们可以去掉"<"和">"中间的所有内容  

    在JavaScript中这很简单:  

    function RemoveHTML( strText ) 

    var regEx = /<[^>]*>/g; 
    return strText.replace(regEx, ""); 


    关于正则表达式可以参考: http://developer.netscape.com/docs/manuals/js/client/jsguide/regexp.htm.  

    现在回到VBScript, 对于Scripting引擎5.0或更高版本(可以通过调用ScriptEngineMajorVersion和ScriptEngineMinorVersion函数来检验版本),我们也可以使用RegExp物体:  

    Function RemoveHTML( strText ) 
    Dim RegEx 

    Set RegEx = New RegExp 

    RegEx.Pattern = "<[^>]*>" 
    RegEx.Global = True 

    RemoveHTML = RegEx.Replace(strText, "") 
    End Function 

    若不用正则表达式,下面的函数可以达到同样的目的:  

    Function RemoveHTML( strText )  
        Dim nPos1 
        Dim nPos2 
         
        nPos1 = InStr(strText, "<")  
        Do While nPos1 > 0  
            nPos2 = InStr(nPos1 + 1, strText, ">")  
            If nPos2 > 0 Then  
                strText = Left(strText, nPos1 - 1) & Mid(strText, nPos2 + 1)  
            Else  
                Exit Do  
            End If  
            nPos1 = InStr(strText, "<")  
        Loop  
         
        RemoveHTML = strText  
    End Function  
    以上的方法虽然都可以去掉括号内的html标签,但是这些方法都存在以下问题:  

    首先,文本内的任何不表示html的尖括号会被去除.而且两个尖括号中间的文本也会被删掉.换句话说,在文本中插入任何"<"或">"都会出现不可预料的结果. 

    另外,这种方法不能控制删除哪些html标签.比如<b><i>这些无害的标签通常是允许的. 

    方法三:使用IE或其他工具 
    有很多缺点: 

    "It may be desirable to parse HTML files inside a Web server process in response to a browser page request. However, the WebBrowser control, DHTML Editing Control, MSHTML, and other Internet Explorer components may not function properly in an Active Server Pages (ASP) page or other application run in a Web server application." (http://support.microsoft.com/support/kb/articles/Q244/0/85.ASP?LN=EN-US&SD=gn&FR=0)  



    方法四:VBScript 
    以下的函数可以限制到具体的html标签 
    简介:  

    要控制被删除的标签列表,可以通过向TAGLIST常数中添加/删除标记来实现. 例如,要保留所有的<B>标签,则从TAGLIST中删除B. 当前的列表包含了MSDN中的所有html标签以及 LAYER 标签. 每个标签要用";"括起来.  
    开始标签和结束标签都会被删除,例如"<A...>"和</A...>  
    若标签同时在 TAGLIST 和 BLOCKTAGLIST 常数中,则起始标签和结束标签之间的所有内容都会被删除  
    没有结束标记的标签不被视为html标签,其内容不会被删除  
    块标签若没有结尾标记,从此标签开始到文本结束的所有内容会被删除  
    若"<!--"后跟的字符不是空格,注释标签不会被删除  
    使用这个函数很简单:  
    strPlainText = RemoveHTML(strTextWithHTML) 
    函数内容如下:  

    Function RemoveHTML( strText ) 
        Dim TAGLIST 
        TAGLIST = ";!--;!DOCTYPE;A;ACRONYM;ADDRESS;APPLET;AREA;B;BASE;BASEFONT;" &_ 
                  "BGSOUND;BIG;BLOCKQUOTE;BODY;BR;BUTTON;CAPTION;CENTER;CITE;CODE;" &_ 
                  "COL;COLGROUP;COMMENT;DD;DEL;DFN;DIR;DIV;DL;DT;EM;EMBED;FIELDSET;" &_ 
                  "FONT;FORM;FRAME;FRAMESET;HEAD;H1;H2;H3;H4;H5;H6;HR;HTML;I;IFRAME;IMG;" &_ 
                  "INPUT;INS;ISINDEX;KBD;LABEL;LAYER;LAGEND;LI;LINK;LISTING;MAP;MARQUEE;" &_ 
                  "MENU;META;NOBR;NOFRAMES;NOSCRIPT;OBJECT;OL;OPTION;P;PARAM;PLAINTEXT;" &_ 
                  "PRE;Q;S;SAMP;SCRIPT;SELECT;SMALL;SPAN;STRIKE;STRONG;STYLE;SUB;SUP;" &_ 
                  "TABLE;TBODY;TD;TEXTAREA;TFOOT;TH;THEAD;TITLE;TR;TT;U;UL;VAR;WBR;XMP;" 

        Const BLOCKTAGLIST = ";APPLET;EMBED;FRAMESET;HEAD;NOFRAMES;NOSCRIPT;OBJECT;SCRIPT;STYLE;" 
         
        Dim nPos1 
        Dim nPos2 
        Dim nPos3 
        Dim strResult 
        Dim strTagName 
        Dim bRemove 
        Dim bSearchForBlock 
         
        nPos1 = InStr(strText, "<") 
        Do While nPos1 > 0 
            nPos2 = InStr(nPos1 + 1, strText, ">") 
            If nPos2 > 0 Then 
                strTagName = Mid(strText, nPos1 + 1, nPos2 - nPos1 - 1) 
         strTagName = Replace(Replace(strTagName, vbCr, " "), vbLf, " ") 

                nPos3 = InStr(strTagName, " ") 
                If nPos3 > 0 Then 
                    strTagName = Left(strTagName, nPos3 - 1) 
                End If 
                 
                If Left(strTagName, 1) = "/" Then 
                    strTagName = Mid(strTagName, 2) 
                    bSearchForBlock = False 
                Else 
                    bSearchForBlock = True 
                End If 
                 
                If InStr(1, TAGLIST, ";" & strTagName & ";", vbTextCompare) > 0 Then 
                    bRemove = True 
                    If bSearchForBlock Then 
                        If InStr(1, BLOCKTAGLIST, ";" & strTagName & ";", vbTextCompare) > 0 Then 
                            nPos2 = Len(strText) 
                            nPos3 = InStr(nPos1 + 1, strText, "</" & strTagName, vbTextCompare) 
                            If nPos3 > 0 Then 
                                nPos3 = InStr(nPos3 + 1, strText, ">") 
                            End If 
                             
                            If nPos3 > 0 Then 
                                nPos2 = nPos3 
                            End If 
                        End If 
                    End If 
                Else 
                    bRemove = False 
                End If 
                 
                If bRemove Then 
                    strResult = strResult & Left(strText, nPos1 - 1) 
                    strText = Mid(strText, nPos2 + 1) 
                Else 
                    strResult = strResult & Left(strText, nPos1) 
                    strText = Mid(strText, nPos1 + 1) 
                End If 
            Else 
                strResult = strResult & strText 
                strText = "" 
            End If 
             
            nPos1 = InStr(strText, "<") 
        Loop 
        strResult = strResult & strText 
         
        RemoveHTML = strResult 
    End Function 
    --------------------------------------------- 

    注:以上是我翻译的 www.codeproject.com 上的一篇老外的文章,自认为比较好。 

    -------------------------------------------- 

    Function stripHTML(strtext) 
    dim arysplit,i,j, strOutput 
    arysplit=split(strtext,"<") 
    if len(arysplit(0))>0 then j=1 else j=0 
    for i=j to ubound(arysplit) 
      if instr(arysplit(i),">") then 
        arysplit(i)=mid(arysplit(i),instr(arysplit(i),">")+1) 
      else 
        arysplit(i)="<" & arysplit(i) 
      end if 
    next 
    strOutput = join(arysplit, "") 
    strOutput = mid(strOutput, 2-j) 
    strOutput = replace(strOutput,">",">") 
    strOutput = replace(strOutput,"<","<") 

    stripHTML = strOutput 
    End Function