又来一个正则表达式!对我来说难度好大!!

michael_monkey 2003-06-18 08:49:57
上次是说如何匹配有效数字(http://expert.csdn.net/Expert/topic/1922/1922536.xml?temp=.7250482),这次来说匹配html标签,严格地说是部分HTML标签——有开头结尾的那种,如<html></html>,不是<br>这种。

微软的帮助上有一个匹配HTML 标记的正则表达式例子:^<(.*)>.*<\/\1>$,但是不够严格了,象<a></b>、< ></ >它也算!

现在我写了一个^<\S+>.*<\S+>$,还是不行,不知道怎么做到前后一致,也就是它还是认为<a></b>这种组合是有效的。

后来我用变量来统一前后:
str="html"
re=new RegExp("^<"+str+">.*</"+str+">$","g")
可是这样好死板!

那么单在正则表达式里面怎么解决这个问题呢?
...全文
116 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
emu 2003-06-21
  • 打赏
  • 举报
回复
只是一个不严谨的例子,参考一下:

<BODY>
<textarea id=t cols=100 rows=20></textarea>
<SCRIPT LANGUAGE="JavaScript">
<!--
var st = "<table align=\"center\"><tbody><tr><td>test1</td><td>test2</td></tr><tr><td>test3</td></tr></tbody></table>";
var r = /<(\w+)(\s.*?)?>.*?<\/\1>/g
var result = new Object;
for (var i=0;i<st.length;i++){
s = st.substr(i).match(r);
if (s) for (var j=0;j<s.length;j++) result[s[j]]=s[j];
}
for (var i in result)
t.value += i+"\n"
//-->
</SCRIPT>
</BODY>
emu 2003-06-21
  • 打赏
  • 举报
回复
嵌套的情形很难处理除非用xmldom,我自己写js处理的时候都是禁止同一个标记嵌套自己的。
michael_monkey 2003-06-21
  • 打赏
  • 举报
回复
sorry,上例中结果应该没有:<td>内容1</td><td>内容2</td>
michael_monkey 2003-06-21
  • 打赏
  • 举报
回复
明白,问题就是在嵌套,准备结之
emu 2003-06-20
  • 打赏
  • 举报
回复
嗯,确实不合法。要这样才合法:

<font <br>>女人</font>

或者按照我们原来期望的:

<font <br>>女人</font>

michael_monkey 2003-06-20
  • 打赏
  • 举报
回复
合法?
michael_monkey 2003-06-20
  • 打赏
  • 举报
回复
有脑筋干嘛不动,不怕生锈?要不,新开一帖,题目就是:用正则正确找出html(xml)文档的所有标记,如:
<table align="center"><tr><td><table><tr><td>内容1</td></tr></table></td></tr></table>
要求列出下列结果:
<table align="center"><tr><td><table><tr><td>内容1</td><td>内容2</td></tr></table></td></tr></table>
<tr><td><table><tr><td>内容1</td><td>内容2</td></tr></table></td></tr>
<td><table><tr><td>内容</td><td>内容2</td></tr></table></td>
<table><tr><td>内容</td><td>内容2</td></tr></table>
<tr><td>内容</td><td>内容2</td></tr>
<td>内容1</td><td>内容2</td>
<td>内容1</td>
<td>内容2</td>




cnlyl 2003-06-20
  • 打赏
  • 举报
回复
哦,原来如此。如果有实用的话,帮你想想办法。这样,我也就不去动脑筋了!!!
xuzuning 2003-06-20
  • 打赏
  • 举报
回复
正则表达式的基础是“形式语言”,而xml较为接近形式语言,html更接近自然语言一点。
永远都不要试图把“世界”放在某个规则里去。如果可能的话,你我也就没有在这里发议论的可能了。

楼主的要求不是不能解决的,只是说不能企图用一个简单的式子来解决,而是把复杂的问题简单化。
比如,若将html从允许的不封闭标签处分割,则每个片段还是有可能用正则匹配的。
michael_monkey 2003-06-20
  • 打赏
  • 举报
回复
没有什么啦,我只是刚学正则,没事自己找了几个题目来做,发现自己水平有限,于是上来象各位讨教。没有明确的目的,也没有希望用它来干什么,倘若一定要给本贴定一个目标,那就是要写出一个尽可能正确地匹配HTML标记的正则表达式
cnlyl 2003-06-20
  • 打赏
  • 举报
回复
楼主:你匹配的目的想干什么?说一下,看我能不能给你一个合理的解决方法
michael_monkey 2003-06-19
  • 打赏
  • 举报
回复
收到

怪我问题没有说清楚,虽然我说了只讨论<html></html>这种标签,不讨论<br>这种标签,但没有说明要不要考虑嵌套、属性等问题,如果谁写出了考虑了嵌套、属性的正则,希望不要吝啬,拿出来让大家参考参考

现在测试各位朋友的不考虑嵌套、属性的正则:
emu(ston) :
<(.*?)>.*?<\/\1>
能匹配< ></ >其中空格是制表符,不对,(csdn检查回复不能为空的时候也忽略了制表符)

bencalie(Bencalie):
/<([a-z]+)>.*<\/\1>/i
好像没有问题,可是我不太懂,后面的\1是什么意思?

<([a-z]+)( .*)?>.*<\/\1>
这个是考虑了属性和嵌套,是么?它虽然
能匹配<font size="10"><b>女人</b></font>
但是它也能匹配<font size="10" <b></b>><b>女人</b></font>
应该也是有问题吧


xuzuning 2003-06-19
  • 打赏
  • 举报
回复
0153(户愚吕弟) 说的有一定道理,若不借助其他逻辑仅用正则表达式是不能完成的。html语法有些混乱,他允许不封闭的标签存在。
0153 2003-06-19
  • 打赏
  • 举报
回复
非常遗憾,楼主的目的是不能达成的。
因为HTML的标签可以有嵌套、缺省等等情况。常规表达式在定位到首标签后无法确定应该做最大匹配还是最小匹配,因此无法正确定位到尾标签。
比如说下面这个嵌套表格:
<table>
<tr>
<td>
<table>
<tr>
<td>内容</td>
</tr>
</table>
</td>
</tr>
</table>
如果要匹配<table></table>标签,用最大匹配只能匹配外层,用最小匹配则定位错误。
因此严格匹配对于HTML来说是无法实现的。
其实楼主去参考一些论坛的BBCode,如VBB,YBB等的转译程序就会明白,那些BBCode的转译程序的常规表达式都是只针对[QUOTE]或[/QUOTE]等单个标签解释,没有一个是严格匹配的,否则必定错误百出。
emu 2003-06-19
  • 打赏
  • 举报
回复
cnlyl(海龙王) :

我上一个帖子迟迟不结是因为一直在考虑有没有更好的解决方式 :) ,而这阵子偏偏又太忙没有时间研究。现在已经结了: http://expert.csdn.net/Expert/topic/1818/1818151.xml

希默软件 2003-06-19
  • 打赏
  • 举报
回复
This maybe ok

<script>
alert(/<([a-z]+)( .*)?>.*<\/\1>/i.test("<htmlabc></html>"))
</script>
希默软件 2003-06-19
  • 打赏
  • 举报
回复
<script>
alert(/<([a-z]+)>.*<\/\1>/i.test("<htmlabc></html>"))
alert(/<(\w+?)>.+?<\/\1>/.test("<htmlabc></html>"))
</script>
michael_monkey 2003-06-19
  • 打赏
  • 举报
回复
海龙王:先给你找出一个问题:
/<([a-z][^\s]*)(.|\n)*?<\/\1>/i

它能匹配<htmlabc></html>,这不是期待的结果
michael_monkey 2003-06-19
  • 打赏
  • 举报
回复
冤,早就结了,只是显示有问题,是csdn的错!您得了65分,不信你看“我得分的帖子”,我的结贴率可是100.000%。
emu 2003-06-19
  • 打赏
  • 举报
回复
<font <br>>女人</font>不是很合法吗?
加载更多回复(8)

87,987

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧