JavaScript,HTML 如何用正则表达式去除字符串中的HTML标记??[以前的帖子都没有完全解决]
1."<[^>]+>|</[^>]+>"
2."<\/*[^<>]*>"
3."<(.*)>.*<\/\1>|<(.*) \/>"
都无法正确地从以下字符串中得到文字内容:
<a href="..." onclick="if(this.href.length>30)alert(‘too big‘)">texttexttext</a>
应该再加上点条件限制就行了,可是我就是搞不定,所以还请高人指点啊!
第一个,少了转意字符\
第二个,贪婪模式所以不行
第三个,中间有回车换行符,.是不能匹配的
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>
"<[^>]*(>|$)/"
你的愿望是美好的,做起来是不可能滴。我是要在别处使用此表达式,不是在浏览器里 :(
还是表示感谢 ,呵呵
感谢回复!
但,还是不行......
<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, ‘‘)">
如果是上面的条件可以用下面的代码。
单凭现在的条件用一个正则很难实现,用多个到是可以的,首先先把奇数的"和‘全替换成别的特殊字符,然后替换特殊字符+ .*? + > + .*? + ["‘],然后用上面的正则替换掉<>之间的内容就可以了,类似一个小型的语法分析器
<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>
左尖括号+若干多字符+下一个左尖括号之前的最后一个右括号
在此之间的全部认为是Match的。
<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>
可惜这个匹配不了文本中包含>这个的情况
\/?应该可以去掉吧
<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>
太谢谢meizz(梅花雪)了!!!
meizz写的表达式至少能够处理90%的情况!
对于这个问题我已经比较满意了,就算是已经解决了,
再放两天,给大伙看看后就结帖,哈哈
我说的没能处理的那10%就是你所说的情况,name后面没有引号,就会出问题。
<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>
PS:写程序的是应该追求完美,但总是这样麻烦别人,我还是有点过意不去的:) 不过meizz能再完善一下那就最好拉,哈哈,再次感谢 !
现在的代码很完美啊,暂时没有发现问题 :)
<a href="..." onclick=if(this.href.length>30)alert(‘too big‘) name=asd>texttexttext</a>
不能正确匹配....这就是我说的“在上述情况下,等号后面的值中,如果有‘>’的话....”
正则:/(?:<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>
<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”)
嘿嘿,俺是不是心黑了点?
<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>
哈哈,不是不理你,是你的代码在我这边运行不了,总出错,所以我也没法试验了啊
而且,我主要是来问如何从
<a href="..." onclick="if(this.href.length>30)alert(‘too big‘)">texttexttext</a>
里用正则表达式取出“texttexttext”的,呵呵
-----------------------------------
恐怕这里不能用[^]这个来匹配了,觉得?!这种应该可以
你的代码可以运行起来,不过需要改为<script language="JAVAscript">后才能执行。
To 天外水火:
<a href="..." onclick=if(this.href.length>30)alert(‘too big‘) name=asd>texttexttext</a>
这是非法的html代码。onclick事件不会被执行。所以如果在正确的页面中,这种情况应该是不会存在的。第二个小Bug也是小概率事件 :)
<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")",
所以对于一个正确的页面,是不太应该出现的。
这是非法的html代码。onclick事件不会被执行”呢?
<a href="page2.html" onClick="count++;alert(count);">下一页</a>
2、弱弱的问下,那个正则[!\w\-:]什么意思
呵呵,怎么去告诉程序name是as>d还是as呢,规范的写的话属性不是都加引号吗,那就ok了~
<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>
[!\w\-:]是因为\w不能包含!、:、-字符
都是强人,晕中~
strCNLetter = Regex.Replace(strMyhtml,"<[^>]*>", "");
strCNLetter = Regex.Replace(strCNLetter,"\\s+", " ");//替换空格
</?\w+((\s+\w+(\s*=\s*(?:".*?"|\‘.*?\‘|[^\‘">\s]+))?)+\s*|\s*)/?>
似乎比楼上几位大大的要简练一些,而且那此敏感字符都能够被正确处理。
此表达式,值得收藏!!!!
╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭══╮╰╮
║ ║ ║ ║ ║ ║ ╰╮╰╮
║ ║ ║ ║ ║ ║ ║ ║
║ ║ ║ ║ ║ ║ ╭╯╭╯
║ ║ ║ ║ ║ ╰══╯╭╯
║ ║ ║ ║ ║ ╭═══╯
║ ║ ║ ║ ║ ║
╰╮╰╮ ╭╯╭╯ ║ ║
╰╮╰═╯╭╯ ╭╯ ╰╮
╰═══╯ ╰═══╯
╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭══╮╰╮
║ ║ ║ ║ ║ ║ ╰╮╰╮
║ ║ ║ ║ ║ ║ ║ ║
║ ║ ║ ║ ║ ║ ╭╯╭╯
║ ║ ║ ║ ║ ╰══╯╭╯
║ ║ ║ ║ ║ ╭═══╯
║ ║ ║ ║ ║ ║
╰╮╰╮ ╭╯╭╯ ║ ║
╰╮╰═╯╭╯ ╭╯ ╰╮
╰═══╯ ╰═══╯
\".*?\" 匹配不了换行符的,所以没有 \"[^\"]*\" 好。
且我一直避免使用 ?: 这种预查功能是为了兼容 IE5.0
呵呵,加这个东西应该没有问题,只是我想试试不用非贪婪和预查,是否也能解决问题
-----------------------------------------------------------
上边这句应该是有含义的,我涉足程序的时间比较短,对版本方面的知识还要多学习,查了下资料,手头上没有低版本的机器,没办法测试,帖出来大家看看
非贪婪匹配 ie5.0以上(不含5.0)
预查 ie5.0以上(不含5.0)
replace()function返回不同的匹配值 5.5以上