CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  JavaScript

如何用正则表达式去除字符串中的HTML标记??[以前的帖子都没有完全解决]

楼主BoweirrKing(忽然变傻)2006-06-29 12:28:33 在 Web 开发 / JavaScript 提问

从网上找到了如下版本:  
  1."<[^>]+>|</[^>]+>"  
  2."<\/*[^<>]*>"  
  3."<(.*)>.*<\/\1>|<(.*)   \/>"  
   
  都无法正确地从以下字符串中得到文字内容:  
  <a   href="..."   onclick="if(this.href.length>30)alert('too   big')">texttexttext</a>  
   
  应该再加上点条件限制就行了,可是我就是搞不定,所以还请高人指点啊!  
   
  谢谢谢谢了!!!! 问题点数:50、回复次数:51Top

1 楼hbhbhbhbhb1021(天外水火(我要多努力))回复于 2006-06-29 12:35:41 得分 0

问题出在  
  第一个,少了转意字符\  
  第二个,贪婪模式所以不行  
  第三个,中间有回车换行符,.是不能匹配的Top

2 楼hbhbhbhbhb1021(天外水火(我要多努力))回复于 2006-06-29 12:41:41 得分 0

还有些问题,问题很有意思Top

3 楼hbhbhbhbhb1021(天外水火(我要多努力))回复于 2006-06-29 12:46:59 得分 0

<script   language=javascript>  
  var   str='<a   href="..."   onclick="if(this.href.length>30)alert(\'too   big\')">texttexttext</a>'  
  obj=document.createElement("div")  
  obj.innerHTML=str  
  alert(obj.getElementsByTagName("a")[0].innerHTML)  
  obj.removeNode(true)  
  </script>Top

4 楼BoweirrKing(忽然变傻)回复于 2006-06-29 12:49:49 得分 0

找了一个老外写的,也不行   :(  
   
  "<[^>]*(>|$)/"Top

5 楼BoweirrKing(忽然变傻)回复于 2006-06-29 12:52:39 得分 0

To   楼上的三星:  
  你的愿望是美好的,做起来是不可能滴。我是要在别处使用此表达式,不是在浏览器里   :(  
   
  还是表示感谢   ,呵呵Top

6 楼meizz(梅花雪)回复于 2006-06-29 12:52:45 得分 0

/<\/?[^<>]+>/gTop

7 楼BoweirrKing(忽然变傻)回复于 2006-06-29 13:11:26 得分 0

To   meizz   :  
  感谢回复!  
  但,还是不行......Top

8 楼hbhbhbhbhb1021(天外水火(我要多努力))回复于 2006-06-29 13:16:31 得分 0

因为里面有大于号,如果是纯正则,那还要想想Top

9 楼meizz(梅花雪)回复于 2006-06-29 13:33:49 得分 0

代码我是测试过的。  
   
  <textarea   id="txt"   style="width:   100%;   height:   200px">  
  aa<b>   >   </b>   <   bb  
  <br/><u>xi  
  </u>  
  </textarea>  
  <input   type="button"   value="ok"   onclick="var   e=document.getElementById('txt');   e.value=e.value.replace(/<\/?[^<>]+>/g,   '')">Top

10 楼hbhbhbhbhb1021(天外水火(我要多努力))回复于 2006-06-29 13:34:41 得分 0

这个问题还要具体情况具体分析下,比如具体的情况中,中间的内容中肯定没有>字符等等条件,  
  如果是上面的条件可以用下面的代码。  
  单凭现在的条件用一个正则很难实现,用多个到是可以的,首先先把奇数的"和'全替换成别的特殊字符,然后替换特殊字符+     .*?     +     >   +     .*?     +     ["'],然后用上面的正则替换掉<>之间的内容就可以了,类似一个小型的语法分析器  
  <script   language=javascript>  
  var   str='<a   href="..."   onclick="if(this.href.length>30)alert(\'too   big\')">texttexttext</a>'  
  re=/\/?<.+?(>(?=((([^>]*?)<)|$)))/g  
  alert(str.replace(re,''))  
  </script>Top

11 楼BoweirrKing(忽然变傻)回复于 2006-06-29 13:35:57 得分 0

我想应该是这样的匹配规则:  
   
  左尖括号+若干多字符+下一个左尖括号之前的最后一个右括号  
   
  在此之间的全部认为是Match的。Top

12 楼zhangfmIT()回复于 2006-06-29 13:56:05 得分 0

/(?:<html.*?>)((\n|\r|.)*?)(?:<\/html>)/  
   
  Top

13 楼meizz(梅花雪)回复于 2006-06-29 13:57:09 得分 0

没看清楚题目:sorry  
   
  <textarea   id="txt"   style="width:   100%;   height:   200px">  
  aa<b   disabled   style="color:   red"   >   >   </b>   <   bb  
  <br/><u>xixxxxxxxxxxxxxxxxxx  
  <a   href="..."   onclick="if(this.href.length>30)alert('too   big')">texttexttext</a>  
  </u>  
  </textarea>  
  <input   type="button"   value="ok"   onclick="mm()"   />  
  <SCRIPT   LANGUAGE="JavaScript">  
  <!--  
  function   mm()  
  {  
          var   e=document.getElementById('txt');  
          e.value=e.value.replace(/<\/?[!\w\-:]+(\s+\w+\s*(=\s*(\'[^\']*\'|\"[^\"]*\"))*)*\/?\s*>/g,   '');  
  }  
  //-->  
  </SCRIPT>Top

14 楼hbhbhbhbhb1021(天外水火(我要多努力))回复于 2006-06-29 14:10:53 得分 0

上面我的还有些问题   改成re=/<.+?(>(?=((([^>]*?)<)|(\s*$))))/g  
  可惜这个匹配不了文本中包含>这个的情况  
   
  \/?应该可以去掉吧  
  Top

15 楼hbhbhbhbhb1021(天外水火(我要多努力))回复于 2006-06-29 14:16:40 得分 0

梅钻的思路应该是=后面的“”或‘’吧,但是如果有下面这种就匹配不了了  
  <textarea   id="txt"   style="width:   100%;   height:   200px">  
  <a   href="..."   onclick="if(this.href.length>30)alert('too   big')"   name=asd>texttexttext</a>  
  </textarea>  
  <input   type="button"   value="ok"   onclick="mm()"   />  
  <SCRIPT   LANGUAGE="JavaScript">  
  <!--  
  function   mm()  
  {  
          var   e=document.getElementById('txt');  
          e.value=e.value.replace(/<\/?[!\w\-:]+(\s+\w+\s*(=\s*(\'[^\']*\'|\"[^\"]*\"))*)*\/?\s*>/g,   '');  
  }  
  //-->  
  </SCRIPT>Top

16 楼BoweirrKing(忽然变傻)回复于 2006-06-29 14:19:52 得分 0

我终于知道红钻是怎么炼成的了   :)  
   
  太谢谢meizz(梅花雪)了!!!  
   
  meizz写的表达式至少能够处理90%的情况!  
   
  对于这个问题我已经比较满意了,就算是已经解决了,  
   
  再放两天,给大伙看看后就结帖,哈哈Top

17 楼BoweirrKing(忽然变傻)回复于 2006-06-29 14:24:33 得分 0

To   天外水火(我要多努力))   :  
  我说的没能处理的那10%就是你所说的情况,name后面没有引号,就会出问题。Top

18 楼hbhbhbhbhb1021(天外水火(我要多努力))回复于 2006-06-29 14:27:41 得分 0

做老本行,研究了下梅老大的代码,我改了点,:)  
  <textarea   id="txt"   style="width:   100%;   height:   200px">  
  aa<b   disabled   style="color:   red"   >   >   </b>   <   bb  
  <br/><u>xixxxxxxxxxxxxxxxxxx  
  <a   href="..."   onclick="if(this.href.length>30)alert('too   big')">texttexttext</a>  
  </u>  
  <a   href="..."   onclick="if(this.href.length>30)alert('too   big')"   name=asd>texttexttext</a>  
  </textarea>  
  <input   type="button"   value="ok"   onclick="mm()"   />  
  <SCRIPT   LANGUAGE="JavaScript">  
  <!--  
  function   mm()  
  {  
          var   e=document.getElementById('txt');  
          e.value=e.value.replace(/<\/?[!\w\-:]+(\s+\w+\s*(=\s*(\'[^\']*\'|\"[^\"]*\"))*)*[^'"]*?>/g,   '');  
  }  
  //-->  
  </SCRIPT>Top

19 楼BoweirrKing(忽然变傻)回复于 2006-06-29 14:29:06 得分 0

在上述情况下,等号后面的值中,如果有“>”的话,则这个右尖括号单纯从字符角度看,和HTML标记的右尖括号似乎已经没有区别了。  
   
  PS:写程序的是应该追求完美,但总是这样麻烦别人,我还是有点过意不去的:)   不过meizz能再完善一下那就最好拉,哈哈,再次感谢   !Top

20 楼BoweirrKing(忽然变傻)回复于 2006-06-29 14:31:11 得分 0

哈哈,更加感谢天外水火!  
   
  现在的代码很完美啊,暂时没有发现问题   :)Top

21 楼BoweirrKing(忽然变傻)回复于 2006-06-29 14:35:07 得分 0

AO,一个小问题:  
  <a   href="..."   onclick=if(this.href.length>30)alert('too   big')   name=asd>texttexttext</a>  
  不能正确匹配....这就是我说的“在上述情况下,等号后面的值中,如果有‘>’的话....”Top

22 楼hbhbhbhbhb1021(天外水火(我要多努力))回复于 2006-06-29 14:44:05 得分 0

恐怕这种情况HTML解析也应该从中间的>结束吧,后面的>应该算在页面内容中Top

23 楼zhangfmIT()回复于 2006-06-29 14:45:28 得分 0

晕倒,没人理我  
   
  正则:/(?:<html.*?>)((\n|\r|.)*?)(?:<\/html>)/  
   
  代码:  
  <script>  
  var   str="ab123<html><def456>c7ghi<htmljkl890</html>mno12p>qrs345<tu>vw</html3>x4y5z6789";  
  var   reg=/(?:<html.*?>)((\n|\r|.)*?)(?:<\/html>)/g;  
  var   result=str.replace(reg,"$1");  
  alert("原式为:"+str+"\n   替换后:"+result);  
  </script>Top

24 楼BoweirrKing(忽然变傻)回复于 2006-06-29 14:46:07 得分 0

AO,一个小问题之二:  
   
  <a   href="..."   onclick="if(this.href.length>30)alert('too   big')"   name=as<d>texttexttext</a>  
  这句正确匹配。(变化体现在name中,现在name的值是“as<d”)  
   
  <a   href="..."   onclick="if(this.href.length>30)alert('too   big')"   name=as>d>texttexttext</a>  
  这句就错了   :(         (现在name的值是“as>d”)  
   
   
  嘿嘿,俺是不是心黑了点?  
  Top

25 楼meizz(梅花雪)回复于 2006-06-29 14:48:45 得分 0

对于有转义的   \"   \"   还是不行:  
   
  <textarea   id="txt"   style="width:   100%;   height:   200px">  
  aa<b   disabled   style="color:   red"   >   >   </b>   <   bb  
  <br/><u>xixxxxxxxxxxxxxxxxxx  
  <a    
  href="..."   onclick="if(this.href.length>30)alert('too   big')">texttexttext</a>  
  <a   href="..."   onclick="if(this.href.length>30)alert('too   big')"   name=asd>texttexttext</a>  
  </u>  
  </textarea>  
  <input   type="button"   value="ok"   onclick="mm()"   />  
  <SCRIPT   LANGUAGE="JavaScript">  
  <!--  
  function   mm()  
  {  
          var   e=document.getElementById('txt');  
          e.value=e.value.replace(/<\/?[!\w\-:]+(\s+\w+\s*(=\s*(\'[^\']*\'|\"[^\"]*\"|[^\s\'\"<>]+))*)*\/?\s*>/g,   '');  
  }  
  //-->  
  </SCRIPT>Top

26 楼BoweirrKing(忽然变傻)回复于 2006-06-29 14:50:11 得分 0

To   zhangfmIT():  
   
  哈哈,不是不理你,是你的代码在我这边运行不了,总出错,所以我也没法试验了啊  
   
  而且,我主要是来问如何从  
  <a   href="..."   onclick="if(this.href.length>30)alert('too   big')">texttexttext</a>  
  里用正则表达式取出“texttexttext”的,呵呵Top

27 楼zhangfmIT()回复于 2006-06-29 14:52:38 得分 0

sorry,偶也看错了Top

28 楼hbhbhbhbhb1021(天外水火(我要多努力))回复于 2006-06-29 14:53:03 得分 0

对于有转义的   \"   \"   还是不行:  
   
   
  -----------------------------------  
  恐怕这里不能用[^]这个来匹配了,觉得?!这种应该可以Top

29 楼meizz(梅花雪)回复于 2006-06-29 14:55:47 得分 0

呵呵,加这个东西应该没有问题,只是我想试试不用非贪婪和预查,是否也能解决问题Top

30 楼BoweirrKing(忽然变傻)回复于 2006-06-29 15:02:02 得分 0

To   zhangfmIT()   again:  
  你的代码可以运行起来,不过需要改为<script   language="javascript">后才能执行。  
   
  To   天外水火:  
  <a   href="..."   onclick=if(this.href.length>30)alert('too   big')   name=asd>texttexttext</a>  
  这是非法的HTML代码。onclick事件不会被执行。所以如果在正确的页面中,这种情况应该是不会存在的。第二个小Bug也是小概率事件   :)  
  Top

31 楼BoweirrKing(忽然变傻)回复于 2006-06-29 15:05:10 得分 0

在DHTML中,   "     和     \"     它们的长度都是一。也就是说,它们实际上是同一个东西。  
  比如:  
  var   s1='"';  
  var   s2='\"';  
  s1和s2是全相等的。Top

32 楼hbhbhbhbhb1021(天外水火(我要多努力))回复于 2006-06-29 15:06:53 得分 0

是啊,现在的问题是meizz说的那个还行  
  <a   href="..."   onclick="if(this.href.length>30)alert(\"too   big\")"   name=asd>texttexttext</a>  
  Top

33 楼BoweirrKing(忽然变傻)回复于 2006-06-29 15:11:37 得分 0

<a   href="..."   onclick="if(this.href.length>30)alert(\"too   big\")"   name=asd>texttexttext</a>  
  这种写法本身就是非法的啊,也就是说  
  onclick="if(this.href.length>30)alert(\"too   big\")"    
  当于  
  onclick="if(this.href.length>30)alert("too   big")",  
  所以对于一个正确的页面,是不太应该出现的。Top

34 楼zhangfmIT()回复于 2006-06-29 15:18:19 得分 0

1、为什么“<a   href="..."   onclick=if(this.href.length>30)alert('too   big')   name=asd>texttexttext</a>  
  这是非法的HTML代码。onclick事件不会被执行”呢?  
   
  <a   href="page2.html"   onClick="count++;alert(count);">下一页</a>  
   
  2、弱弱的问下,那个正则[!\w\-:]什么意思Top

35 楼zhangfmIT()回复于 2006-06-29 15:23:37 得分 0

<a   href="..."   onclick="if(this.href.length>30)alert('too   big')"   name=as>d>texttexttext</a>  
   
  呵呵,怎么去告诉程序name是as>d还是as呢,规范的写的话属性不是都加引号吗,那就ok了~Top

36 楼hbhbhbhbhb1021(天外水火(我要多努力))回复于 2006-06-29 15:24:14 得分 25

不管合不合了吧,也可以实现了,呵呵  
  <textarea   id="txt"   style="width:   100%;   height:   200px">  
  aa<b   disabled   style="color:   red"   >   >   </b>   <   bb  
  <br/><u>xixxxxxxxxxxxxxxxxxx  
  <a    
  href="..."   onclick="if(this.href.length>30)alert('too   big')">texttexttext</a>  
  <a   href="..."   onclick="if(this.href.length>30)alert('too   big')"   name=asd>texttexttext</a>  
  <a   href="..."   onclick="if(this.href.length>30)alert(\"too   big\")"   name=asd>texttexttext</a>  
  </u>  
  </textarea>  
  <input   type="button"   value="ok"   onclick="mm()"   />  
  <SCRIPT   LANGUAGE="JavaScript">  
  <!--  
  function   mm()  
  {  
          var   e=document.getElementById('txt');  
          e.value=e.value.replace(/<\/?[!\w\-:]+(\s+\w+\s*(=\s*(\'(?:((\\\')|[^\']))*\'|\"(?:((\\\")|[^\"]))*\"|[^\s\'\"<>]+))*)*\/?\s*>/g,   '');  
  }  
  //-->  
  </SCRIPT>Top

37 楼hbhbhbhbhb1021(天外水火(我要多努力))回复于 2006-06-29 15:26:25 得分 0

上面很多的测试内容只是举个例子,有的地方有一些语法错误  
  [!\w\-:]是因为\w不能包含!、:、-字符Top

38 楼zhangfmIT()回复于 2006-06-29 15:31:46 得分 0

哦  
  都是强人,晕中~Top

39 楼BoweirrKing(忽然变傻)回复于 2006-06-29 15:43:17 得分 0

真是感谢大家的热心解答啊,哈哈,谢谢谢谢   !!!Top

40 楼xwsn(孤帆远影)回复于 2006-06-30 09:22:10 得分 0

markTop

41 楼addwing(招人的外行都说要"精通",不长眼看下有几个真正精通的)回复于 2006-06-30 09:45:31 得分 0

感谢强人。。。留影。收藏。。。。。。Top

42 楼cuixiping(无心●愚公)回复于 2006-06-30 09:49:16 得分 0

markTop

43 楼hjh1982(能说不是错)回复于 2006-06-30 12:14:29 得分 0

我用.NET是这么做的!  
  strCNLetter   =   Regex.Replace(strMyHtml,"<[^>]*>",   "");  
  strCNLetter   =   Regex.Replace(strCNLetter,"\\s+",   "   ");//替换空格  
  Top

44 楼net205(人不可以无耻到这种地步)回复于 2006-06-30 13:30:01 得分 0

都跑首页上去了,mark下Top

45 楼zhuangyan2004(庄严)回复于 2006-06-30 17:23:21 得分 0

markTop

46 楼BoweirrKing(忽然变傻)回复于 2006-06-30 19:05:54 得分 0

又有新突破,我在国外的网站上,找到了PHP中,strip_tags()函数所使用的正则表达式了,如下:  
  </?\w+((\s+\w+(\s*=\s*(?:".*?"|\'.*?\'|[^\'">\s]+))?)+\s*|\s*)/?>  
  似乎比楼上几位大大的要简练一些,而且那此敏感字符都能够被正确处理。  
   
  此表达式,值得收藏!!!!Top

47 楼shupei721(*北斗星*)回复于 2006-06-30 23:13:38 得分 0

╭═══╮ ╭═══╮ ╭══════╮           
      ╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭══╮╰╮          
       ║ ║   ║ ║   ║ ║  ╰╮╰╮         
       ║ ║   ║ ║   ║ ║   ║ ║         
       ║ ║   ║ ║   ║ ║  ╭╯╭╯         
       ║ ║   ║ ║   ║ ╰══╯╭╯          
       ║ ║   ║ ║   ║ ╭═══╯           
       ║ ║   ║ ║   ║ ║               
       ╰╮╰╮ ╭╯╭╯   ║ ║               
        ╰╮╰═╯╭╯   ╭╯ ╰╮              
         ╰═══╯    ╰═══╯    
  Top

48 楼aspower_(敬个礼 握个手 大家都素好朋友!)回复于 2006-06-30 23:26:54 得分 0

╭═══╮ ╭═══╮ ╭══════╮           
      ╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭══╮╰╮          
       ║ ║   ║ ║   ║ ║  ╰╮╰╮         
       ║ ║   ║ ║   ║ ║   ║ ║         
       ║ ║   ║ ║   ║ ║  ╭╯╭╯         
       ║ ║   ║ ║   ║ ╰══╯╭╯          
       ║ ║   ║ ║   ║ ╭═══╯           
       ║ ║   ║ ║   ║ ║               
       ╰╮╰╮ ╭╯╭╯   ║ ║               
        ╰╮╰═╯╭╯   ╭╯ ╰╮              
         ╰═══╯    ╰═══╯Top

49 楼meizz(梅花雪)回复于 2006-07-03 19:53:38 得分 25

看了一下你后来提供的这个正则,说实话还不如我的正确度高:  
  \".*?\"   匹配不了换行符的,所以没有   \"[^\"]*\"   好。  
  且我一直避免使用   ?:   这种预查功能是为了兼容   IE5.0Top

50 楼hbhbhbhbhb1021(天外水火(我要多努力))回复于 2006-07-04 09:35:46 得分 0

引用    
  呵呵,加这个东西应该没有问题,只是我想试试不用非贪婪和预查,是否也能解决问题  
   
  -----------------------------------------------------------  
  上边这句应该是有含义的,我涉足程序的时间比较短,对版本方面的知识还要多学习,查了下资料,手头上没有低版本的机器,没办法测试,帖出来大家看看  
   
  非贪婪匹配   ie5.0以上(不含5.0)  
  预查   ie5.0以上(不含5.0)  
  replace()function返回不同的匹配值   5.5以上Top

51 楼cunguxu(cunguxu)回复于 2006-07-28 11:00:22 得分 0

能否直接替换掉texttexttext?Top

相关问题

关键词

得分解答快速导航

  • 帖主:BoweirrKing
  • hbhbhbhbhb1021
  • meizz

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo