zoukankan      html  css  js  c++  java
  • 怎样去获取文章简介

       相信大家在做博客,文章管理系统之类的时候经常会遇到这样的问题:
     
       把一些文章抽出来放在首页,当然这些文章要显示内容简介。但是问题来了,这些内容简介有时候有HTML,有时候没有,如果单纯的去截断字符似乎有点笨拙,特别是在DIV页面上,很容易就截断了HTML,导致页面变形了。
        解决办法有很多,有些人是用div的样式去隐藏来解决,但是还是不完整,导致页面变形,或者直接显示出整篇文章来。

    下面的代码就可以解决这个问题,(:) 代码很简单,只是介乎你有没有认真去想而已了,在这里就不对代码做相信说明了。)
    使用方法:直接调用 StripLongContent("你的内容",你要显示在页面上的长度);

    static Regex Content_regex = new Regex("<[^<>]+>?", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Multiline);
    //直接调用这个函数去截断字符
    public static string StripLongContent(string content, int length)
            
    {
                
    //去掉JS
                content = StripScriptTags(content);
                
    string input = "";
                
    if (content.Length <= length)
                    
    return content;
                
    //匹配出<>中的标签
                Match mx = Content_regex.Match(content, 0, content.Length);
                Stack tagStack 
    = new Stack();
                
    int startIndex = 0;
                
    string temp = "";
                
    int maxlength = 0;
                 //其实很简单,保证截取出来的段落有结束的html标签就可以了
                
    while (mx.Value != string.Empty)
                
    {
                    temp 
    = content.Substring(startIndex, mx.Index);
                    //当然也要保证非显示字符数不要包括到要显示的字符数中。否则会严重影响简介的质量
                    
    if (maxlength + temp.Length >= length)
                    
    {
                        temp 
    = temp.Substring(0, length - maxlength);
                        input 
    = input + temp + "" + mx.Value;
                        
    break;
                    }

                    maxlength 
    += temp.Length;
                    input 
    = input + temp + mx.Value;

                    //一个先进后出队列,如果发现有结束,那么从堆栈中取出来
                    
    if (mx.Value.EndsWith("/>"))
                    
    {
                    }

                    
    else if (mx.Value.StartsWith("</"))
                        tagStack.Pop();
                    
    else
                        tagStack.Push(mx.Value);



                    
    int index = content.IndexOf(mx.Value);
                    content 
    = content.Remove(0, index);
                    content 
    = content.Remove(0, mx.Length);

                    mx 
    = Content_regex.Match(content, 0, content.Length);
                }

                
    if (maxlength == 0)
                
    {
                    
    return content.Substring(0, length) + "";
                }
                  //对先进后出队列中已经压入的开始标签填充结束标签
                
    while (tagStack.Count > 0)
                
    {
                    
    string tag = tagStack.Pop().ToString();
                    
    if (tag.IndexOf(' '> 0)
                        tag 
    = tag.Substring(0, tag.IndexOf(' ')).Replace("<""");
                    
    else
                        tag 
    = tag.Replace("<""").Replace(">""");
                    input 
    = input + "</" + tag + ">";
                }

                
    return input;
            }

    //去掉JS代码
    public static string StripScriptTags(string content)
            
    {
                
    string cleanText;
     
                content 
    = Regex.Replace(content, "<script((.|\n)*?)</script>""", RegexOptions.IgnoreCase | RegexOptions.Multiline);
                cleanText 
    = Regex.Replace(content, "\"javascript:""", RegexOptions.IgnoreCase | RegexOptions.Multiline);

                
    return cleanText;
            }
  • 相关阅读:
    RPC调用框架比较分析--转载
    hbase快速入门
    美国诚实签经验——着装,戒指,手表装土豪,医生预约单,流水、房产和工作证明
    美国诚实签经验——英语演练回答,回答中说明目的,需要的时间和费用
    美国诚实签经验——医院预约单和医院资料,孕中保险是加分项
    东京一日游
    cassandra删除所有数据,重置为初始状态——删除<data dir>/data/* <data dir>/commitlog/* <data dir>/saved_caches/* 重启cassandra即可
    echo 到 stderr
    bash编程 将一个目录里所有文件存为一个array 并分割为三等分——利用bash array切片
    linkerd——针对java的为微服务提供可靠性的proxy,服务发现重试LB等
  • 原文地址:https://www.cnblogs.com/SoulStore/p/936877.html
Copyright © 2011-2022 走看看