替换网页中的部分内容(正则表达式)

focusonline 2006-11-07 09:52:10
请问,将网页中的内容取出,然后做替换,但不替换a、script、img之中的数据,例如:

<a href="#">前部分关键词后部分</a>
<p><a href="#">前部分关键词后部分</a></p>
<div><p><a href="#">前部分关键词后部分</a></p></div>
<span><div><p><a href="#">前部分关键词后部分</a></p></div></span>
<span><span><div><p><a href="#">前部分关键词后部分</a></p></div></span></span>
<span><span><span><div><p><a href="#">前部分关键词后部分</a></p></div></span></span></span>
<span><span><span><span><div><p><a href="#">前部分关键词后部分</a></p></div></span></span></span></span>
<a href="#"><span><span><span><span><div><p>前部分关键词后部分</p></div></span></span></span></span></a>

这样,上面的条件都应该不匹配。也就是说,无论a、script、img嵌套在哪层中,它们中间包含的数据都不替换,我写的正则如下:
new RegExp("<([^a]\\S*)([^a]+)>(.*?)"+keyword+"(.*?)<\/\\1>|<(li)>(.*?)"+keyword+"(.*?)(<|\r\n)","i");
content = content.replace(re, "<$1$2$5>$3$6<b>"+keyword+"</b>$4$7<\/$1$5>$8");
但这样有错误(第三组数据中的关键词被替换了)。请问表达式应该如何写?
...全文
645 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
focusonline 2006-11-08
  • 打赏
  • 举报
回复
<a><span>关键词</span></a> //不能做替换,因为嵌套在a中
<span><a>关键词</a></span> //不能做替换,因为嵌套在a中
<a><span><span>关键词</span><span></a> //不能做替换,因为嵌套在a中
<span><span><span>关键词</span><span></span> //替换,因为没有嵌套在a中

<script>alert("关键词");</script> //不能做替换,因为嵌套在script中
<span><script>alert("关键词");</script></span> //不能做替换,因为嵌套在script中
<span><span><span>关键词</span><span></span> //替换,因为里面没有嵌套在script中

<img alt="关键词"> //不能做替换,因为含有img标签
<span><img alt="关键词"></span> //不能做替换,因为含有img标签

以上除注释以后,其余的为文本内容,也就是InputString。
span可能会是div、p、li、font之类的标签。
myvicy 2006-11-08
  • 打赏
  • 举报
回复
<html>
<body>
<textarea id="textarea1" style="height:240;width:960">
前部分关键词后部分 //替换
<a href="#">前部分关键词后部分</a> //不替换,包含在a中
<p><a href="#">前部分关键词后部分</a></p> //不替换,包含在a中
<div><p><a href="#">前部分关键词后部分</a></p></div> //不替换,包含在a中
<span><div><p><a href="#">前部分关键词后部分</a></p></div></span> //不替换,包含在a中
<a><span><div>前部分关键词后部分</div></span></a> //不替换,包含在a中
<font><a href="#">前部分关键词后部分</a>前部分关键词后部分</font> //只替换第二部分的关键词
<span>前部分关键词后部分<div>前部分关键词后部分</div></span> //两部分都要替换

<img alt="前部分关键词后部分" /> //不替换,包含在img中
<span><img alt="前部分关键词后部分" /></span> //不替换,包含在img中
<div><span><img alt="前部分关键词后部分" /></span></div> //不替换,包含在img中

<script>alert("前部分关键词后部分");</script> //不替换,包含在script中
<span><script>alert("前部分关键词后部分");</script></span> //不替换,包含在script中
<div><span><script>alert("前部分关键词后部分");</script></span></div> //不替换,包含在script中
<span><div><script>alert("前部分关键词后部分");</script></div></span> //不替换,包含在script中

<div>前部分关键词后部分</div> //替换
<span><div>前部分关键词后部分</div></span> //替换
</textarea>
<textarea id="textarea2" style="height:240;width:960"></textarea>
<script>
var str=document.getElementById("textarea1").value
var keyword = "关键词";
var myreplace="@#@@"
var re = new RegExp("(.*)?(<a.*>)(.*)"+keyword+"(.*)(<\/a>.*)","ig");
str = str.replace(re,"$1$2$3"+myreplace+"$4$5");
var re = new RegExp("(.*)?(<script.*>)(.*)"+keyword+"(.*)(<\/script>.*)","ig");
str = str.replace(re,"$1$2$3"+myreplace+"$4$5");
var re = new RegExp("(.*)?(<img.*)(.*)"+keyword+"(.*)(\/>.*)","ig");
str = str.replace(re,"$1$2$3"+myreplace+"$4$5");
var re= new RegExp("(.*?)"+keyword+"(.*?)","ig");
str = str.replace(re,"$1<b>"+keyword+"</b>$2");
var re= new RegExp("(.*?)"+myreplace+"(.*?)","ig");
str = str.replace(re,"$1"+keyword+"$2");

document.getElementById("textarea2").value =str

</script>
</body>
</html>
我测试通过了,你看看还有没有其他的特例。
focusonline 2006-11-08
  • 打赏
  • 举报
回复
还有一种情况,就是可能没有<、>标记,如下:
想得到的结果见注释部分,请问能不能用一个正则表达式实现?
<html>
<body>
<textarea id="textarea1" style="height:240;width:960">
前部分关键词后部分 //替换
<a href="#">前部分关键词后部分</a> //不替换,包含在a中
<p><a href="#">前部分关键词后部分</a></p> //不替换,包含在a中
<div><p><a href="#">前部分关键词后部分</a></p></div> //不替换,包含在a中
<span><div><p><a href="#">前部分关键词后部分</a></p></div></span> //不替换,包含在a中
<a><span><div>前部分关键词后部分</div></span></a> //不替换,包含在a中
<font><a href="#">前部分关键词后部分</a>前部分关键词后部分</font> //只替换第二部分的关键词
<span>前部分关键词后部分<div>前部分关键词后部分</div></span> //两部分都要替换

<img alt="前部分关键词后部分" /> //不替换,包含在img中
<span><img alt="前部分关键词后部分" /></span> //不替换,包含在img中
<div><span><img alt="前部分关键词后部分" /></span></div> //不替换,包含在img中

<script>alert("前部分关键词后部分");</script> //不替换,包含在script中
<span><script>alert("前部分关键词后部分");</script></span> //不替换,包含在script中
<div><span><script>alert("前部分关键词后部分");</script></span></div> //不替换,包含在script中
<span><div><script>alert("前部分关键词后部分");</script></div></span> //不替换,包含在script中

<div>前部分关键词后部分</div> //替换
<span><div>前部分关键词后部分</div></span> //替换
</textarea>
<textarea id="textarea2" style="height:240;width:960"></textarea>
<script>
var str=document.getElementById("textarea1").value
var keyword = "关键词";
var re = new RegExp("(.*)<(^(!a|!img|!script))(.*?>.*)" + keyword + "(.*<\/\\2>)(\\1)","ig");
document.getElementById("textarea2").value = str.replace(re,"$1$2$3<b>"+keyword+"</b>$4$5");
</script>
</body>
</html>
xishanlang2001 2006-11-08
  • 打赏
  • 举报
回复
楼上各位,你们的代码有一点小小的问题哦,假如:

<textarea id="textarea1" style="height:200;width:200"><a href="#">前部分关键词后部分</a>
<p><a href="#">前部分关键词后部分1</a></p><div><p><a href="#">前部分关键词后部分2</a></p></div>

<span><div><p><a href="#">前部分关键词后部分3</a></p></div></span>
<span><span><div><p><a href="#">前部分关键词后部分4</a></p></div></span></span>
<span><span><span><div><p><a href="#">前部分关键词后部分5</a></p></div></span></span></span>
<span><span><span><span><div><p><a href="#">前部分关键词后部分</a></p></div></span></span></span></span>
<a href="#"><span><span><span><span><div><p>前部分关键词后部分</p></div></span></span></span></span></a></textarea>
<textarea id="textarea2" style="height:200;width:200"></textarea>
<script language=javascript>
var str=document.getElementById("textarea1").value
re=/(.*)((<a(.*?)>(.*?)<\/a>)|(<script(.*?)>(.*?)<\/script>|<img(.*?)>))(.*)/ig
document.getElementById("textarea2").value=str.replace(re,"$2")
</script>

即有两个<a></a>在同一行的时候...
muxrwc 2006-11-08
  • 打赏
  • 举报
回复
估计我们伟大的LZ是开发浏览器的。。。。。不然不会这么执着的。。
btbtd 2006-11-08
  • 打赏
  • 举报
回复
从天上捅个窟窿, 直接把这些垃圾代码扔出地球, 这样必可大快人心.
hbhbhbhbhb1021 2006-11-08
  • 打赏
  • 举报
回复
正则表达式很多地方都可以用到,很好的东西,不过zhaoxiaoyang说的也是,有些地方不用正则反而效果好些
在另一个帖子已经回复
http://community.csdn.net/Expert/topic/5141/5141765.xml?temp=.4769098
yifuzhiming 2006-11-08
  • 打赏
  • 举报
回复
好麻烦哦,请教各位大哥,正则表达有什么用处
myvicy 2006-11-08
  • 打赏
  • 举报
回复
var content = document.body.innerHTML;
for (var i = 0; i < arrayKeywords.length; i++) {
var keyword = arrayKeywords[i];
var myreplace = "@#@@"
var re = new RegExp("(.*)?(<a.*>)(.*)"+keyword+"(.*)(<\/a>.*)","ig");
content = content.replace(re,"$1$2$3"+myreplace+"$4$5");
re = new RegExp("(.*)?(<script.*>)(.*)"+keyword+"(.*)(<\/script>.*)","ig");
content = content.replace(re,"$1$2$3"+myreplace+"$4$5");
re = new RegExp("(.*)?(<img.*)(.*)"+keyword+"(.*)(\/>.*)","ig");
content = content.replace(re,"$1$2$3"+myreplace+"$4$5");
re= new RegExp("(.*?)"+keyword+"(.*?)","i");
content = content.replace(re,"$1<b>"+keyword+"</b>$2");
re= new RegExp("(.*?)"+myreplace+"(.*?)","ig");
content = content.replace(re,"$1"+keyword+"$2");
}
document.body.innerHTML = content;
focusonline 2006-11-08
  • 打赏
  • 举报
回复
var keyword = arrayKeywords[i];
var myreplace = "@#@@"
var re = new RegExp("(.*)?(<a.*>)(.*)"+keyword+"(.*)(<\/a>.*)","ig");
content = content.replace(re,"$1$2$3"+myreplace+"$4$5");
re = new RegExp("(.*)?(<script.*>)(.*)"+keyword+"(.*)(<\/script>.*)","ig");
content = content.replace(re,"$1$2$3"+myreplace+"$4$5");
re = new RegExp("(.*)?(<img.*)(.*)"+keyword+"(.*)(\/>.*)","ig");
content = content.replace(re,"$1$2$3"+myreplace+"$4$5");
re= new RegExp("(.*?)"+keyword+"(.*?)","i");
content = content.replace(re,"$1<b>"+keyword+"</b>$2");
re= new RegExp("(.*?)"+myreplace+"(.*?)","ig");
content = content.replace(re,"$1"+keyword+"$2");
focusonline 2006-11-08
  • 打赏
  • 举报
回复
我这部分替换是放在方法中的,只想替换第一次的位置,其中arrayKeywords是关键词数组。这样就会出现问题,第二个包含在a中的关键词会被替换。
var content = document.body.innerHTML;
for (var i = 0; i < arrayKeywords.length; i++) {
var keyword = arrayKeywords[i];
var myreplace = "@#@@"
var re = new RegExp("(.*)?(<a.*>)(.*)"+keyword+"(.*)(<\/a>.*)","i");
content = content.replace(re,"$1$2$3"+myreplace+"$4$5");
re = new RegExp("(.*)?(<script.*>)(.*)"+keyword+"(.*)(<\/script>.*)","i");
content = content.replace(re,"$1$2$3"+myreplace+"$4$5");
re = new RegExp("(.*)?(<img.*)(.*)"+keyword+"(.*)(\/>.*)","i");
content = content.replace(re,"$1$2$3"+myreplace+"$4$5");
re= new RegExp("(.*?)"+keyword+"(.*?)","i");
content = content.replace(re,"$1<b>"+keyword+"</b>$2");
re= new RegExp("(.*?)"+myreplace+"(.*?)","i");
content = content.replace(re,"$1"+keyword+"$2");
}
document.body.innerHTML = content;

测试页面的HTML代码如下(其中arrayKeywords为广告,开户,营养):
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn" />
<title>^</title>
</head>
<body>
<a href="#">营养师远程培训</a>
<p><a href="#">营养师远程培训</a></p>
<div><p><a href="#">营养师远程培训</a></p></div>
<span><div><p><a href="#">营养师远程培训</a></p></div></span>
<span><span><div><p><a href="#">营养师远程培训</a></p></div></span></span>
<span><span><span><div><p><a href="#">营养师远程培训</a></p></div></span></span></span>
<span><span><span><span><div><p><a href="#">营养师远程培训</a></p></div></span></span></span></span>
营养师远程培训营养师远程培训广告<br />
<p><a>开户</p></a>
</body>
</html>
focusonline 2006-11-07
  • 打赏
  • 举报
回复
上面的写错了,改成下面的也有错,倒数两行没发生替换,前面的给替换了。
<html>
<body>
<textarea id="textarea1" style="height:240;width:960"><a href="#">前部分关键词后部分</a>
<p><a href="#">前部分关键词后部分</a></p>
<div><p><a href="#">前部分关键词后部分</a></p></div>
<span><div><p><a href="#">前部分关键词后部分</a></p></div></span>
<span><span><div><p><a href="#">前部分关键词后部分</a></p></div></span></span>
<span><span><span><div><p><a href="#">前部分关键词后部分</a></p></div></span></span></span>
<span><span><span><span><div><p><a href="#">前部分关键词后部分</a></p></div></span></span></span></span>
<a href="#"><span><span><span><span><div><p>前部分关键词后部分</p></div></span></span></span></span></a>
<div>前部分关键词后部分</div>
<span><div>前部分关键词后部分</div></span>
</textarea>
<textarea id="textarea2" style="height:240;width:960"></textarea>
<script>
var str=document.getElementById("textarea1").value
var keyword = "关键词";
var re = new RegExp("(.*)(<[^a].*?>.*?)"+keyword+"(.*?<\/a>(\\1))","ig");
document.getElementById("textarea2").value=str.replace(re,"$1$2<b>"+keyword+"</b>$3")
</script>
</body>
</html>
focusonline 2006-11-07
  • 打赏
  • 举报
回复
<html>
<body>
<textarea id="textarea1" style="height:240;width:800"><a href="#">前部分关键词后部分</a>
<p><a href="#">前部分关键词后部分</a></p>
<div><p><a href="#">前部分关键词后部分</a></p></div>
<span><div><p><a href="#">前部分关键词后部分</a></p></div></span>
<span><span><div><p><a href="#">前部分关键词后部分</a></p></div></span></span>
<span><span><span><div><p><a href="#">前部分关键词后部分</a></p></div></span></span></span>
<span><span><span><span><div><p><a href="#">前部分关键词后部分</a></p></div></span></span></span></span>
<a href="#"><span><span><span><span><div><p>前部分关键词后部分</p></div></span></span></span></span></a>
<div>前部分关键词后部分</div>
<span><div>前部分关键词后部分</div></span>
</textarea>
<textarea id="textarea2" style="height:240;width:800"></textarea>
<script language=javascript>
var str=document.getElementById("textarea1").value
var keyword = "关键字";
var re = new RegExp("(.*)((<a(.*?)>(.*?)"+keyword+"(.*?)<\/a>)|(<script(.*?)>(.*?)"+keyword+"(.*?)<\/script>|<img(.*?)>))(\\1)","ig");
document.getElementById("textarea2").value=str.replace(re,"$1$2")
</script>
</body>
</html>

现在应该将<div>前部分关键词后部分</div>
<span><div>前部分关键词后部分</div></span>中的内容替换成<div>前部分<b>关键词</b>后部分</div>
<span><div>前部分<b>关键词</b>后部分</div></span>。其它的关键字不做替换,可是这个正则没有没有实现。
hbhbhbhbhb1021 2006-11-07
  • 打赏
  • 举报
回复
<textarea id="textarea1" style="height:200;width:200"><a href="#">前部分关键词后部分</a>
<p><a href="#">前部分关键词后部分</a></p>
<div><p><a href="#">前部分关键词后部分</a></p></div>
<span><div><p><a href="#">前部分关键词后部分</a></p></div></span>
<span><span><div><p><a href="#">前部分关键词后部分</a></p></div></span></span>
<span><span><span><div><p><a href="#">前部分关键词后部分</a></p></div></span></span></span>
<span><span><span><span><div><p><a href="#">前部分关键词后部分</a></p></div></span></span></span></span>
<a href="#"><span><span><span><span><div><p>前部分关键词后部分</p></div></span></span></span></span></a></textarea>
<textarea id="textarea2" style="height:200;width:200"></textarea>
<script language=javascript>
var str=document.getElementById("textarea1").value
re=/(.*)((<a(.*?)>(.*?)<\/a>)|(<script(.*?)>(.*?)<\/script>|<img(.*?)>))(.*)/ig
document.getElementById("textarea2").value=str.replace(re,"$2")
</script>
梅雪香 2006-11-07
  • 打赏
  • 举报
回复
你不能把正则当成处理所有文本事件的神.它毕竟只是正则,不能做一切事情.
建议你换个方法,遍历文档树,处理所有textNode节点
下面是一些摘要: ●目录 本文目标 如何使用本教程 什么是正则表达式? 入门 测试正则表达式 元字符 字符转义 重复 字符类 反义 替换 分组 后向引用 位置指定 负向位置指定 注释 贪婪与懒惰 处理选项 平衡组/递归匹配 还有些什么东西没提到 一些我认为你可能已经知道的术语的参考 网上的资源及本文参考文献 更新说明 ●本文目标 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它。 ●如何使用本教程 别被下面那些复杂的表达式吓倒,只要跟着我一步一步来,你会发现正则表达式其实并没有你想像的那么困难。当然,如果你看完了这篇教程之后,发现自己明白了很多,却又几乎什么都记不得,那也是很正常的——我认为,没接触过正则表达式的人在看完这篇教程后,能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本的原理,以后你还需要多练习,多查资料,才能熟练掌握正则表达式。 除了作为入门教程之外,本文还试图成为可以在日常工作使用的正则表达式语法参考手册(就作者本人的经历来说,这个目标还是完成得不错的)。 文本格式约定:专业术语 元字符/语法格式 正则表达式 正则表达式的一部分(用于分析) 用于在其搜索的字符串 对正则表达式或其部分的说明清除格式 ●什么是正则表达式? 在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。 很可能你使用过Windows/Dos下用于文件查找的通配符(wildcard),也就是*和?。如果你想查找某个目录下的所有的Word文档的话,你会搜索*.doc。在这里,*会被解释成任意的字符串。和通配符类似,正则表达式也是用来进行文本匹配的工具,只不过比起通配符,它能更精确地描述你的需求——当然,代价就是更复杂——比如你可以编写一个正则表达式,用来查找所有以0开头,后面跟着2-3个数字,然后是一个连字号“-”,最后是7或8位数字的字符串(像010-12345678或0376-7654321)。 正则表达式是用于进行文本匹配的工具,所以本文里多次提到了在字符串里搜索/查找,这种说法的意思是在给定的字符串,寻找与给定的正则表达式相匹配的部分。有可能字符串里有不止一个部分满足给定的正则表达式,这时每一个这样的部分被称为一个匹配。匹配在本文里可能会有三种意思:一种是形容词性的,比如说一个字符串匹配一个表达式;一种是动词性的,比如说在字符串里匹配正则表达式;还有一种是名词性的,就是刚刚说到的“字符串满足给定的正则表达式的一部分”。

87,910

社区成员

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

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