asp.net(文章截取前几行作为列表摘要)无损返回HTML代码

 更新时间:2012年12月04日 16:56:54   作者:  
asp.net(文章截取前几行作为列表摘要)无损返回HTML代码,需要的朋友可以参考下

复制代码 代码如下:

<BR>        /* <STRONG>时间很久远了,有码友要,我抄了下来,记得使用的时候还是有部分例外情况要处理,大部分是ok的。</STRONG>
        * 函数: 
        * 说明:无损返回HTML代码
        *      
        * 作者:卡斯Kas(QQ:10590916)
        * 修改:2010-12-13、
        */

        public static string LeftH(string str, int l)
        {
            //为了防止错误
            string odstr = str;
            bool isHtml = false;//判断截取开头是否是字符串
            int maxLen = str.Length;
            int n = 0, i = 0, b = 0, e = 0;
            string c, c2 = "", Start = "", EndLabel = "", AllLabel = "";
            if (l >= str.Length) return str;//截取字段大于字符长度

            bool isErr = false;
            try
            {
            while (n < l && i < maxLen)
            {
                //1
                i++;
                c = str.Substring(i - 1, 1);

                string end2str = "";
                try
                {
                    end2str = str.Substring(i - 1, 2);
                }
                catch
                {
                    end2str = "";
                }
                if (c == "<" && end2str != "</")
                {
                    isHtml = true;
                    b = i;//记录一个位置
                    //5     解决非成对标签

                    string end2tag = "";
                    try
                    {
                        end2tag = str.Substring(i, 2);
                    }
                    catch
                    {
                        end2tag = "";
                    }

                    if (end2tag == "br")
                    {
                        isHtml = false;
                    }
                    if (str.Substring(i, 1).ToLower() == "%")
                    {
                        isHtml = false;
                    }
                    if (str.Substring(i, 1).ToLower() == "?")
                    {
                        isHtml = false;
                    }
                    else if (end2tag == "hr")
                    {
                        isHtml = false;
                    }
                    //5end
                }
                //1end

                //2
                if (c == "<" && end2str == "</")
                {
                    c2 = str.Substring(i - 1, str.Substring(i - 1).IndexOf(">") + 1);
                    AllLabel = AllLabel.Substring(c2.Length);
                }
                //2end

                Start = Start + c;//记录当前字符及其前面字符

                if (!isHtml)
                {
                    //6     较为准确的计数
                    try
                    {
                        if (str.Substring(i, 2).ToLower() == "br")
                        {
                        }
                        else if (str.Substring(i, 2).ToLower() == "hr")
                        {
                        }
                        else
                        {
                            n++;
                        }
                    }
                    catch
                    {
                        //如果出错,则返回纯文本(@"<[^>]+>|</[^>]+>");
                        //odstr = Regex.Replace(odstr, @"<[^>]+>|</[^>]+>", "", RegexOptions.IgnoreCase);
                        odstr = odstr.Replace("<", "<").Replace(">", ">");
                        if (l > odstr.Length) l = odstr.Length;
                        return odstr.Substring(0, l);
                    }
                    //6end
                }
                else
                {
                    if (c == ">")//如果循环到>时,要处理的成对标签中间部分
                    {
                        if (isHtml)
                        {
                            EndLabel = str.Substring(b, i - b);//获取<到>之间的代码
                            e = EndLabel.IndexOf(" ");//标签属性都有空格,以空格为分割,获取标签名
                            if (e > 0)
                            {
                                EndLabel = "</" + EndLabel.Substring(0, e) + ">";
                            }
                            else
                            {
                                EndLabel = "</" + EndLabel;
                            }
                            AllLabel = EndLabel + AllLabel;//记录当前结束标签,及所有有关结束标签
                        }
                        isHtml = false;//重置属性,从新开始
                    }
                }
                //4     当结束时,发现有未闭合的标签,则重新来一次
                if (n + 1 >= l)
                {
                    if (InStrN(Start, "<") != InStrN(Start, ">"))
                    {
                        n--;
                    }
                }
                //4end
            }//end while

            }
            catch
            {
                isErr = true;
            }

            string newReString = Start + AllLabel + "...";

            //最后再次验证
            Regex Rg = new Regex("<.[^>/]+>", RegexOptions.Compiled);
            Regex Rg2 = new Regex(@"<\s*/[a-z]\s*>", RegexOptions.Compiled);

            if (inStrLen(newReString, "<") != inStrLen(newReString, ">"))
            {
                isErr = true;
            }
            else if (inStrLen(newReString.Replace(""", "\""), "\"") % 2 == 1)
            {
                isErr = true;
            }
            else if (Rg.Matches(newReString).Count != Rg2.Matches(newReString).Count)
            {
                isErr = true;
            }
            if (isErr)
            {
                odstr = odstr.Replace("<", "<").Replace(">", ">").Replace("\"", """).Replace("'", "'");
                if (l > odstr.Length)
                { newReString = odstr; }
                else
                {
                    try
                    {
                        newReString = odstr.Substring(0, l) + "...";
                    }
                    catch
                    {
                        newReString = odstr;
                    }
                }
            }

            return newReString;//返回
        }

相关文章

  • sqlserver 批量数据替换助手V1.0版发布

    sqlserver 批量数据替换助手V1.0版发布

    前段时间网站被挂马,数据库表中很多文本字段都被加上了一段js脚本。修复完程序漏洞之后便开始着手清理这些被注入的数据,其间参考了一些网上的方法,大都是写一个存储过程进行一个表一个表逐一清理。
    2011-10-10
  • .NET Core中获取各种路径的的方法总结

    .NET Core中获取各种路径的的方法总结

    在 .NET Core 开发过程中,正确处理文件路径是每个开发者都会遇到的常见需求,无论是读取配置文件、写入日志,还是管理上传的文件,都需要准确地获取各种路径信息,本文将全面介绍 .NET Core 中获取各种路径的方法,帮助开发者避免常见的"坑",需要的朋友可以参考下
    2025-04-04
  • IsPostBack原理的介绍

    IsPostBack原理的介绍

    本篇文章,小编将为大家介绍,关于IsPostBack的原理,有需要的朋友可以参考一下
    2013-04-04
  • 详解.Net缓存之MemoryCahe

    详解.Net缓存之MemoryCahe

    这篇文章主要介绍了.Net缓存之MemoryCahe的相关资料,帮助大家更好的理解和学习使用.net技术,感兴趣的朋友可以了解下
    2021-05-05
  • 微软ajax库的使用方法(ajax.ajaxMethod)

    微软ajax库的使用方法(ajax.ajaxMethod)

    使用AjaxMethod可以在客户端异步调用服务端方法,简单地说就是在JS里调用后台.cs文件里的方法,做一些JS无法做到的操作,如查询数据库
    2013-08-08
  • .net GridView分页模板的实例代码

    .net GridView分页模板的实例代码

    .net GridView分页模板的实例代码,对分页代码有兴趣的朋友可以参考一下
    2013-03-03
  • asp.net生成验证码代码(纯中文)

    asp.net生成验证码代码(纯中文)

    下面我来写一个生成纯中文的验证码技术,写一个类库,需要的朋友可以参考下
    2012-06-06
  • 高效的.Net UDP异步编程实现分析

    高效的.Net UDP异步编程实现分析

    重点是怎么建立一种高效的UDP机制来实时接收服务器发送过来的数据包.本文将介绍.Net UDP异步编程如何实现解决方案,有需求的朋友可以参考下
    2012-11-11
  • asp.net log4net的使用方法

    asp.net log4net的使用方法

    这篇文章主要介绍了asp.net log4net的使用,需要的朋友可以参考下
    2016-05-05
  • .NET中堆栈和堆的特点与差异介绍

    .NET中堆栈和堆的特点与差异介绍

    这篇文章介绍了.NET中堆栈和堆的特点与差异,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-03-03

最新评论