asp.net(文章截取前幾行作為列表摘要)無損返回HTML代碼

來源:互聯網
上載者:User

複製代碼 代碼如下:<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;//返回
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.