一个实用的html标题的截取指定长度的问题
文章标题如下:
<span style=color:red> 截取指定长度的问题 </span>
或
<span style= "color:red "> 截取指定长度的问题 </span>
或
<font color=red> 截取指定长度的问题 </font>
或
<font color= 'red '> <b> 截取指定长度的问题 <b> </font>
一类的简单html代码
要求达到截取一定长度的目的,如截取4个字就是
<span style=color:red> 截取指定... </span> 一类的结果。
截取6个字就是
<span style=color:red> 截取指定长度... </span> 一类的结果。
谁做过这方面的尝试吗?效果有理想的吗?
[解决办法]
style= "OVERFLOW: hidden; WORD-BREAK: keep-all; TEXT-OVERFLOW: ellipsis;width:40px "
指定里面的宽度就可以
[解决办法]
string yourStr = richTextBox1.Text;
string resultStr = " ";
string sub1 = Regex.Replace(yourStr, @ " <[\s\S]*?> (?![^ <> ]*?> ) ", " ");
if(sub1.Length> 6)
{
string sub2 = sub1.Substring(0,6);
resultStr = yourStr.Replace(sub1,sub2+ "... ");
}
else
{
resultStr = yourStr;
}
richTextBox2.Text = resultStr;
用上面的程序,可以处理楼主所给所有例子,超过6个字截取,少于6个字保留原样
但是问题仍然存在,比如楼主所给的例子
<font color= 'red ' onclick= "javascript:if(2> 1){alert( '2> 1 ')} "> 我是标题 </font>
如果改成
<font color= 'red ' onclick= "javascript:if(2> 1){alert( 'a <b ')} "> 我是标题 </font>
那就无法处理了,程序毕竟不如人智能,除非能保证标题遵守一定的规则,比如说都是汉字,那样还可以处理
-----------------------
一家之言,有不对的地方还请指正
[解决办法]
String CutTitle(String str,int num)
{
//先把 "**** <> <> title <> <> "中的 "**** "去除,得到 " <> <> title <> <> "格式
String tempStr=str.subString(0,str.IndexOf( " < "));
str=str.subString(str.IndexOf( " < "));
//通过循环找到title
while(str.subStirng(0,1)== " < ")
{
tempStr=tempStr+str.subString(0,str.IndexOf( "> ")+1);
str=str.subString(Str.IndexOf( "> ")+1);
}
//找到了title,CUT掉多余的部分
String title=str.subString(0,str.IndexOf( " < ");
if(title.length> num)
title=title.subString(0,num);
tempStr=tempStr+title;
//把title后面的 <> <> 加到tempStr;
str=str.subString(0,str.IndexOf( " < ");
tempStr=tempStr+str;
return tempStr;
}
[解决办法]
像这种处理我做过,不过可能会麻烦点
步骤:
1.写一个方法public string GetTag(string strTag);
这个方法得到一个html 文档里的所有 strTag的标记。
如strTag=“span”: <span style= "width:150px "> 内容 </span>
2.再写一个方法得到标记内的InnerHTML(里面可能还有其它的标记见3),这样就可以得到标记内的内容了。
3.如果标记内还有其它标记再进行1
http://www.cnblogs.com/HeroBeast/archive/2007/02/25/656360.html
这是我写的一个小工具。里面有这样的处理。
[解决办法]
public string HtmlSubstring(string AHtml, int ALength)
{
string vReturn = " ";
int vLength = 0; // 增加的文字长度
int vFlag = 0; // 当前扫描的区域0:普通区1:标记区
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 删除无效标记
string vTemp;
do
{
vTemp = vReturn;
vReturn = Regex.Replace(vReturn, @ " <[^> ^\/]*?> <\/[^> ]*?> ", " ",
RegexOptions.IgnoreCase);
}
while (vTemp != vReturn);
#endregion
return vReturn;
}
private void button1_Click(object sender, EventArgs e)
{
string s = @ " <span style= " " OVERFLOW: hidden; WORD-BREAK: keep-all; " +
@ " TEXT-OVERFLOW: ellipsis;width:100% " "> " +
@ "adfad中国人民很行fasldfasdfasdfasdfas " +
@ " </span> ";
Text = HtmlSubstring(s, 8);
}
[解决办法]
是不是要这种效果,这个职能截中文,中英文混合比较麻烦。
<script>
function btnClick(){
var ss=document.getElementById( "s1 ").innerHTML;
//alert(ss);
ss=ss.substring(0,4)+ "...... ";
document.getElementById( "s1 ").innerHTML = ss;
}
</script>
<span style= "color:red " value= "aaa " name= "sss " id= "s1 "> 一二三四五六七八九十 </span>
<input type= "button " value= "CLICK " onClick= "btnClick(); " />
[解决办法]
汉字都是等宽的,英文一般是不等宽的。
不同字体集的同一个字,宽度可能不一样;
同一字体集的不同字,宽度可能一样。
尽管很复杂,但我们的页面都是固定好字体集了的,只要调整合适就可以了。
一个汉字的宽度,大多数情况下近似等于两个英文的宽度,我们不需要那么斤斤计较,为一两个象素而伤脑筋,后面预留两三个空格就可以了。
对于标题中含有HTML的情况,也很好解决,首先使用正则表达式过滤所有的HTML标记就可以了。
总体思路就是这样:
html=Regex.Replace(html,@ " <(? <标记> \w+).*> (? <内容> [^ <> ]*) <\/\k <标记> > ", "${标记} ");
这样就去掉了所有HTML标记。
然后用Encoding.GetBytes 转成字节数组,再用Encoding.Convert 转成DBCS字节数组,就可以得到字符串的“真实长度”了,取前面部分的时候,要特别注意,不要把一个汉字劈成两半。汉字的两个字节都是大于128的。
上面的表达式,可以到我网站http://nnhy.org去下载那个正则表达式测试工具测试。我已经测试通过。