日期:2014-05-20  浏览次数:20778 次

来一个问题。不知道是否属于算法问题。包含html语言的文字长途截取
有一段html语言代码。也就是说一个网页的段落。
要要截取前100个不计算html标记符在内的文字。当然取出来的文字要保留html标记本省
例如
以下
<div> <span   style= "COLOR:   #ff0000 "> 测试测试测试 </span> <span   style= "COLOR:   #ff0000 "> 再次测试 </span> </div>
我要取3位那么要得到结果
<div> <span   style= "COLOR:   #ff0000 "> 测试测 </span> </div>
如果我要取8位。那么要得到结果

<div> <span   style= "COLOR:   #ff0000 "> 测试测试测试 </span> <span   style= "COLOR:   #ff0000 "> 再次 </span> </div>



------解决方案--------------------
//参考如下代码,如果测试出来还有什么问题先自己看看
//再把测试的数据和理想的结果贴出来

public string HtmlSubstring(string AHtml, int ALength)
{
string vReturn = " ";
int vLength = 0; // 增加的文字长度
int vFlag = 0; // 当前扫描的区域 0:普通区 1:标记区 // 不考虑在标记中出现 <button value= " < "> 情况
foreach(char vChar in AHtml)
{
switch (vFlag)
{
case 0: // 普通区
if (vChar == ' < ')
{
vReturn += vChar;
vFlag = 1;
}
else
{
vLength++;
if (vLength <= ALength)
vReturn += vChar;
}
break;
case 1: // 标记区
if (vChar == '> ') vFlag = 0;
vReturn += vChar;
break;
}
}
#region 删除无效标记 // " <span> <b> </b> </span> " -> " "
string vTemp = Regex.Replace(vReturn, @ " <[^> ^\/]*?> <\/[^> ]*?> ", " ", RegexOptions.IgnoreCase); // 删除空标记
while (vTemp != vReturn)
{
vReturn = vTemp;
vTemp = Regex.Replace(vReturn, @ " <[^> \/]*?> <\/[^> ]*?> ", " ", RegexOptions.IgnoreCase); // 删除空标记
}
#endregion
return vReturn;
}
private void button2_Click(object sender, EventArgs e)
{
string S = @ " <span style= " "COLOR: #ff0000 " "> <b> 测试 </b> <u> 测试测试 </u> </span> <span style= " "COLOR: #ff0000 " "> <b> 测试 </b> <u> 测试测试 </u> </span> ";
int L = 1;

Text = HtmlSubstring(S, L);
}