asp.net (this article extracts the first few lines of the list as a summary) returns the HTML code without loss
- 2020-05-19 04:30:34
- OfStack
<BR> /* <STRONG> Time is very long ago, have the code friend to want, I copied down, remember to use the time or some exceptions to deal with, most is ok . </STRONG>
* Function:
* Description: return without damage HTML code
*
* Author: cass Kas(QQ : 10590916)
* Modification: 2010-12-13 ,
*/
public static string LeftH(string str, int l)
{
// To prevent errors
string odstr = str;
bool isHtml = false;// Determines if the beginning of the intercept is a string
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;// The intercept field is larger than the character length
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;// record 1 A position
//5 Resolve unpaired tags
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;// Records the current character and its preceding character
if (!isHtml)
{
//6 A more accurate count
try
{
if (str.Substring(i, 2).ToLower() == "br")
{
}
else if (str.Substring(i, 2).ToLower() == "hr")
{
}
else
{
n++;
}
}
catch
{
// If there is an error, plain text is returned (@"<[^>]+>|</[^>]+>");
//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 we loop to > When you want to deal with the middle part of the paired tag
{
if (isHtml)
{
EndLabel = str.Substring(b, i - b);// To obtain < to > Code between
e = EndLabel.IndexOf(" ");// Tag attributes have space, space for the segmentation, get the tag name
if (e > 0)
{
EndLabel = "</" + EndLabel.Substring(0, e) + ">";
}
else
{
EndLabel = "</" + EndLabel;
}
AllLabel = EndLabel + AllLabel;// Record the current closing tag and all relevant closing tags
}
isHtml = false;// Reset the property and start over
}
}
//4 When finished, a tag is found that is not closed, then start again 1 time
if (n + 1 >= l)
{
if (InStrN(Start, "<") != InStrN(Start, ">"))
{
n--;
}
}
//4end
}//end while
}
catch
{
isErr = true;
}
string newReString = Start + AllLabel + "...";
// And then finally verify again
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;// return
}