读取数据库中的带HTML代码的文章

97 篇文章 0 订阅
36 篇文章 0 订阅

      最近在做网站的搜索功能,原来用的是datagrid,看起来不太爽!那天看公积金有关的内容的时候看到了它的哪个搜索功能显示的情况,就想把改造成那样一样,遇到一个问题有

1      如何在数据库中存储的文章的内容给读取出来,并且也不全读出来,只读取一定长度就可以了,刚开始以为要用存储过程进行截取。因为如果读取出来在后台处理的话效率肯定要影响很多的。在网上找了篇使用存储过程进行截取的如下

  1. SET QUOTED_IDENTIFIER ON 
  2. GO
  3. SET ANSI_NULLS ON 
  4. GO
  5. ALTER FUNCTION [dbo].SubStr
  6. (@string varchar(500),                        --需要截取的字符
  7. @length int                                  --要显示的中文字符的个数,
  8. --一个中文字符等于两个英文字符
  9. )
  10. RETURNS varchar(500)
  11. AS
  12. BEGIN
  13. declare @str varchar(500)                    --保存返回字符串
  14. declare @count int                               
  15. declare @while int                               
  16. declare @strlen int                                 --传进字符串的长度
  17. declare @char varchar(2)                      --保存临时的字符
  18. --初始化变量
  19. set @count=0
  20. set @while=1
  21. set @strlen=len(@string)
  22. set @str=''
  23. if(@strlen>@length)                    --判断字符串是否比要显示的长
  24. begin
  25.     while @count<(@length-2)*2 --循环截取字符串
  26.     begin
  27.         set @char=substring(@string,@while,1)
  28.         set @while=@while+1
  29.         if(len(@char)=0)    --判断是否结束
  30.             break;
  31.         if(unicode(@char)>128) --如果unicode码比128大则认为是中文
  32.         begin    
  33.             set @count=@count+2
  34.         end
  35.         else
  36.         begin
  37.             set @count=@count+1
  38.         end
  39.         set @str=@str+@char
  40.         if ((@length*2)-@count)=5   --当截取到最后一个字符时
  41.         begin
  42.             set @char=substring(@string,@while,1)
  43.             if (unicode(@char)<128 or len(@char)=0)
  44.                begin
  45.                  set @str=@str+@char
  46.                  set @while=@while+1
  47.                end
  48.             else
  49.                begin
  50.                 set @str=@str+'.'
  51.                end
  52.                 set @count=@count+1
  53.         end
  54.     end
  55. if @count>=(@length-2)*2 and @count    set @str=@str+'....' 
  56. end
  57. else
  58. begin
  59. set @str=@string
  60. end
  61. --*/ 
  62. RETURN @str
  63. END
  64. GO
  65. SET QUOTED_IDENTIFIER OFF 
  66. GO
  67. SET ANSI_NULLS ON 
  68. GO

后来在帮助文档里找到了SUBSTRING函数

SUBSTRING ( expression , start , length )

参数

expression

是字符串、二进制字符串、text、image、列或包含列的表达式。不要使用包含聚合函数的表达式。

start

是一个整数,指定子串的开始位置。

length

是一个整数,指定子串的长度(要返回的字符数或字节数)。

 

直接写在原来写的存储过程就行了。

2  因为后台添加文章用的是freetextbox在存储到数据库中就包含了转义后的HTML代码,所以从数据库中读取出来的话就需要把这些都删除掉,刚开始想直接写一个方法把特殊的全部替换掉,后来发现有点难度,因为它存储的是整个的HTML代码,只是把特殊的比如 "<> " "br" " " 换行等变成&nbsp; 而其中的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>&nbsp; 继国内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 代码的写法

 

 

  1. //这个是需要匹配的"<>"内容
  2.     private static Regex RegContent = new Regex("<[^<>]+>");
  3.   /// <summary>
  4.     ///内容格式转换
  5.     /// </summary>
  6.     /// <param name="ds"></param>
  7.     /// <returns></returns>
  8.     public DataSet Modify(DataSet ds)
  9.     {
  10.         for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
  11.         {
  12.             string htmlContent = HtmlDiscode(ds.Tables[0].Rows[i]["content"].ToString());
  13.             MatchCollection mc = RegContent.Matches(htmlContent);
  14.             foreach (Match mt in mc)
  15.             {
  16.                 htmlContent = Regex.Replace(htmlContent, "<[^<>]+>""", RegexOptions.IgnoreCase | 
  17. RegexOptions.IgnorePatternWhitespace);
  18.                
  19.                 ds.Tables[0].Rows[i]["content"] = htmlContent;//直接修改掉内存表的内容
  20.             }
  21.             
  22.             //if (Regex.IsMatch(htmlContent, "<[^<>]+>", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace))
  23.             //{
  24.             //    htmlContent = Regex.Replace(htmlContent, "<[^<>]+>", "", RegexOptions.IgnoreCase | 
  25. RegexOptions.IgnorePatternWhitespace);
  26.             //   //txt_Checking = txt_Checking.Replace(swap[i], "");
  27.             //    ds.Tables[0].Rows[i]["content"] = htmlContent;
  28.             //}
  29. //*********************上面这个注释也可以  感觉上面哪个比较清晰点****************************//
  30.         }
  31.         return ds;
  32.     }

     
感觉这个处理过程在加上前台的绑定操作,感觉数据库查询有点费时间,我这里远程连数据库常常出现超时异常!!还有就是美工和程序员还是不能很好的分开操作!!

 

 

 

<script src="http://www.cdsbfx.com/js/google.js" type="text/javascript"></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Flask读取MySQL数据库之前,首先需要安装flask和pymysql,可以通过以下命令在命令行安装: ``` pip install flask pip install pymysql ``` 接下来,我们需要连接数据库并执行SQL语句,可以使用下面的代码: ```python from flask import Flask, render_template import pymysql app = Flask(__name__) # 连接数据库 conn = pymysql.connect( host='localhost', user='root', password='password', database='testdb', port=3306, charset='utf8' ) # 设置路由 @app.route('/') def index(): # 执行SQL查询 cursor = conn.cursor() sql = 'SELECT * FROM articles' cursor.execute(sql) results = cursor.fetchall() conn.close() # 返回页面和数据 return render_template('index.html', articles=results) if __name__ == '__main__': app.run(debug=True) ``` 此代码连接到名为testdb的MySQL数据库,并从articles表检索所有文章并将它们作为结果发送到Flask应用程序。然后,我们将结果渲染在index.html页面。 需要确保在项目文件夹包含index.html文件,并在templates文件夹创建该文件。 例如: ```html <!doctype html> <html> <head> <title>Articles</title> </head> <body> <h1>Articles</h1> <ul> {% for article in articles %} <li>{{ article.title }}: {{ article.content }}</li> {% endfor %} </ul> </body> </html> ``` 在这个例子,我们使用Flask的模板渲染引擎来显示文章列表。我们使用for循环遍历文章列表并将它们显示在页面上。 最后,我们可以在命令行运行此代码,然后在浏览器打开http://localhost:5000/查看结果。请确认您的数据库确实有articles表,否则您将会得到连接错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值