首页 新闻 会员 周边

内文广告程序开发中遇到的一个问题

0
悬赏园豆:20 [已解决问题] 解决于 2008-06-15 10:33
<P><FONT face=Verdana>最近在弄 网站广告助手程序,见<A href="http://ad.aspx1.cn/"><FONT color=#1d58d1>http://ad.aspx1.cn/</FONT></A> 。<BR>其中的第一个广告类型我们选择了 文中广告。<BR>现在遇到一个问题暂时不知道如何解决:<BR>我们对关键词加超链接的操作是通过正则表达式替换地,这就遇到一个问题,必须首先判断出页面中的这个关键词是是属于html标签的一部分(如title,alt等),还是属于可替换的文本。<BR>否则将title,alt等属性内的文字全部替换为超链接,就会造成页面dom结构的混乱。</FONT></P><FONT face=Verdana> <P>如下面的html代码:</P> <DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><IMG alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">div</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">电脑是个好东西,我们大家都喜欢</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">img&nbsp;</SPAN><SPAN style="COLOR: #ff0000">src</SPAN><SPAN style="COLOR: #0000ff">="3w.jpg"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;alt</SPAN><SPAN style="COLOR: #0000ff">="电脑"</SPAN><SPAN style="COLOR: #0000ff">/&gt;</SPAN><SPAN style="COLOR: #000000">你喜欢电脑么?&nbsp;</SPAN><SPAN style="COLOR: #0000ff">&lt;</SPAN><SPAN style="COLOR: #800000">a&nbsp;</SPAN><SPAN style="COLOR: #ff0000">href</SPAN><SPAN style="COLOR: #0000ff">="index.htm"</SPAN><SPAN style="COLOR: #ff0000">&nbsp;title</SPAN><SPAN style="COLOR: #0000ff">="电脑"</SPAN><SPAN style="COLOR: #0000ff">&gt;&lt;/</SPAN><SPAN style="COLOR: #800000">a</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN><SPAN style="COLOR: #000000">哈哈,就是这个东西。<BR><IMG alt="" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></SPAN><SPAN style="COLOR: #0000ff">&lt;/</SPAN><SPAN style="COLOR: #800000">div</SPAN><SPAN style="COLOR: #0000ff">&gt;</SPAN></DIV> <P>我们想把“电脑”这个关键词转化超链接,如果用一般正则替换的方法的话,就将title,alt属性内的“电脑”也都给替换了。</P> <P>所以这里请各位指点一下,怎么判断出“电脑”这个词属于可替换的文本,还是属于html标签的一部分。</P> <P>正在看广告联盟的相关代码,不过目前还没能理出个头绪。</P></FONT>
问题补充: 多谢各位拉。 按照 玉开 的提示写了 如下 js。 遗憾的是 添加的超级连接是以文本方式显示的,如何让他显示为超连接形式呢?好象node没有类似innerHTML的属性。 再次烦扰了。 <script type="text/javascript"> function aa () { var ans = document.body.childNodes; var i=0; for(;i<ans.length;i++) { a(ans[i]); } } function a(n) { if(n.hasChildNodes()) { for(i =0 ;i<n.childNodes.length ;i++) { a(n.childNodes[i]); } } else { if(n.nodeType==3&&n.nodeValue && n.nodeValue.indexOf("电脑") !=-1) n.nodeValue= "<a href='http://baidu.com'>" + n.nodeValue+"</a>"; } } window.onload= aa; </script>
aspx1的主页 aspx1 | 初学一级 | 园豆:65
提问于:2008-06-12 07:57
< >
分享
最佳答案
0
[code] Regex regex = new Regex("(?<tag><[^>]+?>)(?<t>[^<]*)",RegexOptions.Compiled); string input = @"<div>电脑是个好东西,我们大家都喜欢<img src=""3w.jpg"" alt=""电脑""/>你喜欢电脑么? <a href=""index.htm"" title=""电脑""></a>哈哈,就是这个东西。 </div>是这个东西"; bool isTagARange = false; string output = regex.Replace(input, delegate(Match m) { if (m.Groups["t"] != null) { string tag = m.Groups["tag"].Value; //a 之间的内容一律不处理 if (tag.StartsWith("<a") || tag.StartsWith("<A")) isTagARange = true; if (tag.StartsWith("</a>") || tag.StartsWith("</A") )isTagARange = false; string txt = m.Groups["t"].Value; if (!isTagARange) { return m.Groups["tag"].Value + AddAdForTxt(txt); } } //不处理直接返回原匹配字符串 return m.Value; }); Response.Write(output); [/code] [code] //这个方法需要实现将纯文本加上广告链接 private string AddAdForTxt(string text) { return "AD" + text + "AD"; } [/code] 发表之后发现你是发在javascript类别中的问题,如果是js的话,会更容易解决一些,你可以通过childNodes遍历页面所有元素,根据元素的tagName处理元素内部的文本。
玉开 | 大侠五级 |园豆:8822 | 2008-06-12 09:15
其他回答(2)
0
关键是总结出规律来。 凡是符合类似<img > <a > ...这种情况,也就是从左尖括号之后跟着html标签开始(有限的,正则里可以直接列出来),到后面第一个右括号之间的内容,就不替换,否则就替换。
致博腾远 | 园豆:1389 (小虾三级) | 2008-06-12 09:25
0
static void Main(string[] args) { string content = "<div>电脑是个好东西,我们大家都喜欢<img src=\"3w.jpg\" alt=\"电脑\"/>你喜欢电脑么? <a href=\"index.htm\" title=\"电脑\"></a>哈哈,就是这个东西。</div>"; string newContent = Regex.Replace(content, "([^\"]+?)(?<content>电脑)([^\"].+?)", new MatchEvaluator(DoReplace)); Console.Write(newContent); Console.ReadLine(); } static string DoReplace(Match m) { if (m.Groups["content"].Success) return m.Value.Replace("电脑","<a href=\"computer.aspx\">电脑</a>"); else return m.Value; }
沙加 | 园豆:3680 (老鸟四级) | 2008-06-12 11:38
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册