最近在做网站的搜索功能,原来用的是datagrid,看起来不太爽!那天看公积金有关的内容的时候看到了它的哪个搜索功能显示的情况,就想把改造成那样一样,遇到一个问题有
1 如何在数据库中存储的文章的内容给读取出来,并且也不全读出来,只读取一定长度就可以了,刚开始以为要用存储过程进行截取。因为如果读取出来在后台处理的话效率肯定要影响很多的。在网上找了篇使用存储过程进行截取的如下
- SET QUOTED_IDENTIFIER ON
- GO
- SET ANSI_NULLS ON
- GO
- ALTER FUNCTION [dbo].SubStr
- (@string varchar(500), --需要截取的字符
- @length int --要显示的中文字符的个数,
- --一个中文字符等于两个英文字符
- )
- RETURNS varchar(500)
- AS
- BEGIN
- declare @str varchar(500) --保存返回字符串
- declare @count int
- declare @while int
- declare @strlen int --传进字符串的长度
- declare @char varchar(2) --保存临时的字符
- --初始化变量
- set @count=0
- set @while=1
- set @strlen=len(@string)
- set @str=''
- if(@strlen>@length) --判断字符串是否比要显示的长
- begin
- while @count<(@length-2)*2 --循环截取字符串
- begin
- set @char=substring(@string,@while,1)
- set @while=@while+1
- if(len(@char)=0) --判断是否结束
- break;
- if(unicode(@char)>128) --如果unicode码比128大则认为是中文
- begin
- set @count=@count+2
- end
- else
- begin
- set @count=@count+1
- end
- set @str=@str+@char
- if ((@length*2)-@count)=5 --当截取到最后一个字符时
- begin
- set @char=substring(@string,@while,1)
- if (unicode(@char)<128 or len(@char)=0)
- begin
- set @str=@str+@char
- set @while=@while+1
- end
- else
- begin
- set @str=@str+'.'
- end
- set @count=@count+1
- end
- end
- if @count>=(@length-2)*2 and @count set @str=@str+'....'
- end
- else
- begin
- set @str=@string
- end
- --*/
- RETURN @str
- END
- GO
- SET QUOTED_IDENTIFIER OFF
- GO
- SET ANSI_NULLS ON
- GO
后来在帮助文档里找到了SUBSTRING函数
SUBSTRING ( expression , start , length )
参数
expression
是字符串、二进制字符串、text、image、列或包含列的表达式。不要使用包含聚合函数的表达式。
start
是一个整数,指定子串的开始位置。
length
是一个整数,指定子串的长度(要返回的字符数或字节数)。
直接写在原来写的存储过程就行了。
2 因为后台添加文章用的是freetextbox在存储到数据库中就包含了转义后的HTML代码,所以从数据库中读取出来的话就需要把这些都删除掉,刚开始想直接写一个方法把特殊的全部替换掉,后来发现有点难度,因为它存储的是整个的HTML代码,只是把特殊的比如 "<> " "br" " " 换行等变成 而其中的FONT face=楷体_GB2312它又不变,这些因为不特殊所以无法一一替换。解决办法就是把这些特殊的都替换成原来的html代码 这样就有规律啦,所有的不特殊的html代码都包含在<>中了。这样就可以利用正则表达式进行替换了。关于正则表达式
^符号匹配字符串的开头。例如:
^abc 与“abc xyz”匹配,而不与“xyz abc”匹配
$符号匹配字符串的结尾。例如:
abc$ 与“xyz abc”匹配,而不与“abc xyz”匹配。
注意:如果同时使用^符号和$符号,将进行精确匹配。例如:
^abc$ 只与“abc”匹配
*符号匹配0个或多个前面的字符。例如:
ab* 可以匹配“ab”、“abb”、“abbb”等
+符号匹配至少一个前面的字符。例如:
ab+ 可以匹配“abb”、“abbb”等,但不匹配“ab”。
?符号匹配0个或1个前面的字符。例如:
ab?c? 可以且只能匹配“abc”、“abbc”、“abcc”和“abbcc”
.符号匹配除换行符以外的任何字符。例如:
(.)+ 匹配除换行符以外的所有字符串
x|y匹配“x”或“y”。例如:
abc|xyz 可匹配 “abc”或 “xyz”,而“ab(c|x)yz”匹配 “abcyz”和“abxyz”
{n}匹配恰好n次(n为非负整数)前面的字符。例如:
a{2} 可以匹配“aa“,但不匹配“a”
{n,}匹配至少n次(n为非负整数)前面的字符。例如:
a{3,} 匹配“aaa”、“aaaa”等,但不匹配“a”和“aa”。
注意:a{1,}等价于a+
a{0,}等价于a*
{m,n}匹配至少m个,至多n个前面的字符。例如:
a{1,3} 只匹配“a”、“aa”和“aaa”。
注意:a{0,1}等价于a?
[xyz]表示一个字符集,匹配括号中字符的其中之一。例如:
[abc] 匹配“a”、“b”和“c”
[^xyz]表示一个否定的字符集。匹配不在此括号中的任何字符。例如:
[^abc] 可以匹配除“a”、“b”和“c”之外的任何字符
[a-z]表示某个范围内的字符,匹配指定区间内的任何字符。例如:
[a-z] 匹配从“a”到“z”之间的任何一个小写字母字符
[^m-n]表示某个范围之外的字符,匹配不在指定范围内的字符。例如:
[m-n] 匹配除从“m”到“n”之间的任何字符
/符号是转义操作符。例如:
/n 换行符
/f 分页符
/r 回车
/t 制表符
/v 垂直制表符
// 匹配“/”
// 匹配“/”
/s 任何白字符,包括空格、制表符、分页符等。等价于“[ /f/n/r/t/v]”
/S 任何非空白的字符。等价于“^/f/n/r/t/v]”
/w 任何单词字符,包括字母和下划线。等价于“[A-Za-z0-9_]”
/W 任何非单词字符。等价于“[^A-Za-z0-9_]”
/b匹配单词的结尾。例如:
ve/b 匹配单词“love”等,但不匹配“very”、“even”等
/B匹配单词的开头。例如:
ve/B 匹配单词“very”等,但不匹配“love”等
/d匹配一个数字字符,等价于[0-9]。例如:
abc/dxyz 匹配“abc2xyz”、“abc4xyz”等,但不匹配“abcaxyz”、“abc-xyz”等
/D匹配一个非数字字符,等价于[^0-9]。例如:
abc/Dxyz 匹配“abcaxyz”、“abc-xyz”等,但不匹配“abc2xyz”、“abc4xyz”等
/NUM匹配NUM个(其中NUM为一个正整数),引用回到记住的匹配。例如:
(.)/1 匹配两个连续相同的字符。
/oNUM匹配n(其中n为一个小于256的八进制换码值)。例如:
/o011 匹配制表符
/xNUM匹配NUM(其中NUM为一个小于256的十六进制换码值)。例如:
/x41 匹配字符“A”
刚开始我写的是<.*>结果就是只能配平一个并且如果中间有中文的话它也会给你替换掉,比如
“<P> <FONT face=楷体_GB2312><STRONG>成都日报讯</STRONG></FONT> 继国内LCD(中小尺寸液晶显示器)巨头京东方科技去年10
月落户成都,投资兴建4.5代TFT–LCD生产线后,国内规模最大的LCD及LCM(液晶显示模块)制造企业天马微电子公司也将投资锁定成都。记者
22日获悉,天马微电子公司与成都市高新区合作,投资约30亿元人民币,在高新区新建4.5代TFT–LCD生产线。深天马总经理刘瑞林22日在接受
记者采访时表示,成都独特的三大优势是吸引他们前来的重要原因,未来成都将”
替换后就变成了
“继国内LCD(中小尺寸液晶显示器)巨头京东方科技去年10月落户成都,投资兴建4.5代TFT–LCD生产线后,国内规模最大的LCD及LCM(液晶显
示模块)制造企业天马微电子公司也将投资锁定成都。记者22日获悉,天马微电子公司与成都市高新区合作,投资约30亿元人民币,在高新区
新建4.5代TFT–LCD生产线。深天马总经理刘瑞林22日在接受记者采访时表示,成都独特的三大优势是吸引他们前来的重要原因,未来成都将”
继续改进 <[^>].*>这个的话只能替换掉每段开头的头一个<>中内容
最后改成<[^<>].*> 顺利通过 ^_^
3 代码的写法
- //这个是需要匹配的"<>"内容
- private static Regex RegContent = new Regex("<[^<>]+>");
- /// <summary>
- ///内容格式转换
- /// </summary>
- /// <param name="ds"></param>
- /// <returns></returns>
- public DataSet Modify(DataSet ds)
- {
- for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
- {
- string htmlContent = HtmlDiscode(ds.Tables[0].Rows[i]["content"].ToString());
- MatchCollection mc = RegContent.Matches(htmlContent);
- foreach (Match mt in mc)
- {
- htmlContent = Regex.Replace(htmlContent, "<[^<>]+>", "", RegexOptions.IgnoreCase |
- RegexOptions.IgnorePatternWhitespace);
- ds.Tables[0].Rows[i]["content"] = htmlContent;//直接修改掉内存表的内容
- }
- //if (Regex.IsMatch(htmlContent, "<[^<>]+>", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace))
- //{
- // htmlContent = Regex.Replace(htmlContent, "<[^<>]+>", "", RegexOptions.IgnoreCase |
- RegexOptions.IgnorePatternWhitespace);
- // //txt_Checking = txt_Checking.Replace(swap[i], "");
- // ds.Tables[0].Rows[i]["content"] = htmlContent;
- //}
- //*********************上面这个注释也可以 感觉上面哪个比较清晰点****************************//
- }
- return ds;
- }
感觉这个处理过程在加上前台的绑定操作,感觉数据库查询有点费时间,我这里远程连数据库常常出现超时异常!!还有就是美工和程序员还是不能很好的分开操作!!