asp.Net(記事の切り取りの前の行をリストの要約として)はHTMLコードを無損に返します

7085 ワード




        /* , , , , ok 。
        * : 
        * : 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 == "                {
                    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 == "                {
                    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("", ">");
                        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, ""))
                    {
                        n--;
                    }
                }
                //4end
            }//end while

            }
            catch
            {
                isErr = true;
            }

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

            //
            Regex Rg = new Regex("<.>/]+>", RegexOptions.Compiled);
            Regex Rg2 = new Regex(@"", RegexOptions.Compiled);

            if (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("'", "'");
                if (l > odstr.Length)
                { newReString = odstr; }
                else
                {
                    try
                    {
                        newReString = odstr.Substring(0, l) + "...";
                    }
                    catch
                    {
                        newReString = odstr;
                    }
                }
            }

            return newReString;//
        }