ASP.NET C#截断

ASP.NET C#截断,c#,asp.net-mvc,C#,Asp.net Mvc,我在数据库列中存储了以下内容: <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 con

我在数据库列中存储了以下内容:

<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>

我记得读到过,使用
Html.Encode
会去除Html标记,但不是100%确定,也不确定如何将其与将内容截断为40个字符的方法结合起来。如果有人能帮我,那就太棒了。谢谢。

从我的头顶,像这样的东西

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将只对
标记进行编码,而不会删除它。如果要完全删除它,只需执行
result=result.Replace(“”,string.Empty)

用法:

<% Html.EncodeAndTrimText(Model.SomeProperty) %>


我有一些函数可以满足您的需要。它使用正则表达式剥离html。以下是一个示例程序:

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;
            }    
        }    
    }
}
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{    
字符串s=@"知识本身是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德有时,我们会毫不犹豫地把动物当作劳动来惩罚

知识本身是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德有时,我们会毫不犹豫地把动物当作劳动来惩罚

知识本身是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德,是一种美德有时,我们会毫不犹豫地认为,这是对动物的惩罚。

“; Console.WriteLine(Truncate(StripHTML,40)+“…”); Console.ReadLine(); } 公共静态字符串StripHTML(字符串html) { 返回RegularExpressions.Regex.Replace(html,@“”,string.Empty,RegularExpressions.RegexOptions.IgnoreCase); } 公共静态字符串截断(字符串输入,整数长度) { bool isTruncated=true; 如果(input.Length>Length) { char[]TextEnds={'','\n','\r','\0','\f','\t','\v'}; 字符串温度=输入子字符串(0,长度+1); 字符串temp2=临时修剪(TextEnds); if(temp2==temp) { 我们在一个词的中间截断 temp2=临时子字符串(0,临时LastIndexOfAny(TextEnds)); } 其他的 { 我们没有在一个词的中间截断。 //现在我们只需要返回temp2 //我们确实需要确定单词的实际文本 //在我们决定是否真的截断了 if(temp2==input.TrimEnd(TextEnds)) isTruncated=false; } 返回temp2; } 其他的 { 返回输入; } } } }
我通过在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;
           }
       }
    }
}
namespace InventorySystem.Models
{
公共类清单项
{
公共Int Id{get;set;}
公共字符串注释{get;set;}
...
带注释的公共字符串
{
得到
{
//您可以在此处添加一些附加代码以删除
返回(Notes.Length>50)?Notes.Substring(0,50)+“…”:Notes;
}
}
}
}

您的值是否总是采用布拉

布拉

布拉

的格式,或者目前是否有更一般的要求?例如,更复杂的html?就这样。我也会这样做,尽管根据要求,您可能希望检测您是否将一个单词切成两半,并在最后一次spac时在单词开始之前对其进行修剪e、 代码的第一部分将放在哪里?在该视图的控制器内部?字符串
“(39个字符)和“
打破了这一点,因为输出将是
”(39个字符)和…
-这是无效的HTML。@Cameron-它是一个自定义HTML帮助程序,基本上是一个扩展方法。将它放在web应用程序的某个文件中。(ie HtmlExtensions.cs)@Travis Gockel-你确定吗?我的印象是
HttpUtility.HtmlEncode
将用
&;
替换
,后者实际上是有效的html。我错了吗?如果m.article部分有“”或“

"在文本中,而不是仅在开头和结尾?@SquidScareMe
m.article
是一个字符串,链接在一起的两个替换方法将删除字符串中出现的所有
标记。在呈现时,浏览器将忽略字符串中剩余的任何换行符。是的,这是正确的这是我的观点。您的解决方案在大多数实际情况下都会起作用。但是,如果字符串应该有一个标记,它也会被剥离。也许正则表达式会是一个更好的解决方案?如果您想要
标记,您就不会剥离它们。如果您想将结果字符串包装成一个
元素只需将格式字符串更改为这个
“{0:40}…

,yo
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;
            }    
        }    
    }
}
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;
           }
       }
    }
}