日期:2014-05-18  浏览次数:20793 次

100分求助,在帖子内容中查找链接字串并加超链接
求各位大虾帮帮吧,在此,小弟我感谢了。
需要的功能是这样的:用户发帖,保存到数据表,读取帖子时用HTML编码后输出显示。现在我想的是如果内容中有网址,给这些网址加上超链接,读者一点这链接串就新开浏览器窗口打开网址。
下面的代码是我写的,经测试,如果文章没有重复网址的话,是正常的,如果有重复网址就不正常了,所以特地请教各位大哥(大姐)帮帮我。

C# code
string content = "库中查出的文章内容";
        //为了便于测试效果,自定义一段内容
        content = "各位朋友,你知道csdn.net这个网站吗?这是中国最专业的最大的编程技术论坛型网站,网址是www.csdn.net,输入csdn.net也一样正常访问,我在csdn.net上也有博客,欢迎大家看我的文章哦,嘿嘿";

        //先对文章内容进行HTML编码
        content = Server.HtmlEncode(content).Replace(" ", "&nbsp;").Replace("\r\n", "<br/>");

        //用正则查找文中链接字串并加超链接
        //下面这行代码为URL正则
        string URLzhengze = "(http[s]?://)?(www\\.)?(([a-zA-Z0-9-_]{1,35}\\.){1,3})((com)|(net)|(org)|(com\\.cn)|(net\\.cn)|(org\\.cn)|(cn)|(la)|(hk)|(info)|(cc)|(tel)|(gov\\.cn)|(so)|(name)|(me)|(co)|(biz)|(cc)|(tv)|(asia))((/[a-zA-Z0-9-_%@]{1,50})|(/)){0,5}(\\.[a-zA-Z]{2,6})?(\\?[a-zA-Z0-9-_]{1,30}=[a-zA-Z0-9-_%@]{0,50})?(&[a-zA-Z0-9-_]{1,30}=[a-zA-Z0-9-_%@]{0,50}){0,3}";
        
        //下面的代码为声明一个变量,变量意思是RUL集合,用来接收帖子内容中查出的所以URL字串的集合,并用半角空格分开每个URL字串
        string URLjihe = "";

        MatchCollection mc = Regex.Matches(content, URLzhengze, RegexOptions.IgnoreCase);
        foreach (Match m in mc)    //循环查找后,集成一个集合,注意,各个之间必须用符号分隔开来,这里用空格来分隔,主要是为了能用string.Trim()方法去除首尾空格,下一步处理起来方便
        {
            URLjihe += m.Value + " ";   //如果匹配项小于1,该集合就为0字节
        }
        URLjihe = URLjihe.Trim();  //对查找出来的集合,去掉首尾空格(中间空格依然保留)
        if (URLjihe.Length > 5)    //如果至少有一个链接,长度至少会大于5,没有就不用执行下面的代码了
        {
            string[] sArray = Regex.Split(URLjihe, " ", RegexOptions.IgnoreCase); //建立一个数组来接收输入的字符串
            for (int i = 0; i < sArray.Length; i++)         //sArray.Length获取该数组中的所有元素的总和,并作循环处理
            {
                string URLText = sArray[i].ToString();     //这是用户自己输写的链接字串原文,注意必须加ToString(),否则报错
                string lianjieUrl = URLText;               //程序给原字串添加的链接URL,注意:用户自己输入的链接字串不可直接使用,因为一旦用户不加http://的话,浏览器就会解释为相对路径
                if (Regex.IsMatch(URLText, "http[s]?://") == false)   //如果链接地址串中无http://,则会被浏览器解释为相对路径,所以必须搞成绝对路径。
                {
                    lianjieUrl = "http://" + URLText;
                }
                content = content.Replace(URLText, "<a href='" + lianjieUrl + "' target='_blank'>" + URLText + "</a>");
                //content = Regex.Replace(content, URLText, "<a href='" + lianjieUrl + "' target='_blank'>" + URLText + "</a>", RegexOptions.IgnoreCase);  //此处不能用这个方法,否则报错,必须用上一行代码
            }
        }

        Label1.Text = content;   //输出文章内容到页面


 我自己测试的结果:
 情况1、若只有一个URL字串,则完全正常。
 情况2、有多个URL字串,且这些URL字串没有相同的重复,也正常。
 情况3、如果有多个URL字串的情况下,这些URL字串有相同的重复值,则程序会对相同的URL字串多次替换。

 我实在是没有办法了,所以请教各位大侠帮帮我,在些小弟真是不胜感激了!
 祝各位龙年事业有成,合家安康幸福!


------解决方案--------------------
搞好你的正则。
Regex.Replace不行吗?
------解决方案--------------------
你可以把字符串中的网址先正则替换成{0},{1}之类的,可以与sArray 下标对应,这样最后可以Format