简体   繁体   English

ASP.NET C#截断

[英]ASP.NET C# Truncate

I have the following content stored inside a database column: 我在数据库列中存储了以下内容:

<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>

It is displayed using the following: <%= m.article %> 使用以下内容显示: <%= m.article %>

What I would like to do is strip out the <p> tags and then only show say 40 characters and end it with ... so that I would end up with something like: 我想做的是去掉<p>标记,然后只显示40个字符,并以...结尾,这样我最终得到的是:

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat...

I remember reading that using Html.Encode would strip the HTML tags, but not 100% sure about that, and not sure how to combine this with a way of truncating the content to 40 characters. 我记得读过使用Html.Encode会剥离HTML标记,但是对此不是100%的确定,也不知道如何将其与将内容截断为40个字符的方式结合使用。 If someone could help me with this that'd be awesome. 如果有人可以帮助我,那就太好了。 Thanks. 谢谢。

Off the top of my head, something like this? 在我的头顶上,像这样吗?

public static string EncodeAndTrimText(this HtmlHelper helper, string text)
{
   string result = string.Empty;
   result = HttpUtility.HtmlEncode(result);
   if (result.length > 40)
      return result.Substring(0, 40) + "...";
   return result;
}

HttpUtility.HtmlEncode will only encode the <p> tag, not remove it. HttpUtility.HtmlEncode将仅对<p>标记进行编码,而不会将其删除。 If want it removed totally, just do result = result.Replace("<p>", string.Empty); 如果要完全删除它,只需执行result = result.Replace("<p>", string.Empty);

Usage: 用法:

<% Html.EncodeAndTrimText(Model.SomeProperty) %>
<%= String.Format("{0:40}...", m.article.Replace("<p>", string.Empty).Replace("</p>", string.Empty) %>

I have some functions that do what you want. 我有一些功能可以满足您的需求。 It uses regular expressions to strip the html. 它使用正则表达式去除html。 Here is an example program: 这是一个示例程序:

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {    
            string s = @"<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>";    

            Console.WriteLine(Truncate(StripHTML(s), 40) + "...");
            Console.ReadLine();
        }    

        public static string StripHTML(string html)
        {
            return RegularExpressions.Regex.Replace(html, @"<.*?>", string.Empty, RegularExpressions.RegexOptions.IgnoreCase);    
        }

        public static string Truncate(string input, int length)
        {
            bool isTruncated = true;

            if (input.Length > length)
            {
                char[] TextEnds = { ' ', '\n', '\r', '\0', '\f', '\t', '\v' };
                string temp = input.Substring(0, length + 1);
                string temp2 = temp.TrimEnd(TextEnds);

                if (temp2 == temp)
                {
                    //we truncated in the middle of a word
                    temp2 = temp.Substring(0, temp.LastIndexOfAny(TextEnds));    
                }
                else
                {
                    //we did not truncate in the middle of a word
                    //now we just need to return temp2 

                    //we do need to determine if the actual text of the word 
                    //changed before we decide if we have really truncated the
                    if (temp2 == input.TrimEnd(TextEnds))
                        isTruncated = false;    
                }                    
                return temp2;
            }
            else
            {    
                return input;
            }    
        }    
    }
}

I accomplished this by adding a function to my Models class, example: 我通过在Models类中添加一个函数来实现此目的,例如:

namespace InventorySystem.Models
{
    public class InventoryItem
    {
       public Int Id { get; set; }
       public string Notes { get; set; }
       ...
       public string NotesTruncated
       {
           get
           {
               //you could add some additional code here to remove the <p>
               return (Notes.Length > 50) ? Notes.Substring(0, 50) + "..." : Notes;
           }
       }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM