LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3189|回复: 17

重量级问题:请问做MYSQL搜索的时候,如何过滤HTML代码

[复制链接]
发表于 2007-8-11 15:49:15 | 显示全部楼层 |阅读模式
请问做MYSQL搜索的时候,如何过滤HTML代码

如果我提交新闻内容的时候,用的是编辑器做的,那么在存放内容的字段将会有很多HTML代码,比如:  table,td,tr,div等等

那么,如果我在添加新闻内容的时候,也有一些HTML代码重合的字符串,比如:新闻内容可能会有一个: table 字符串,但这个不是HTML代码,而是新闻内容中的字符串,那么当我做MYSQL搜索的时候,如何准确的只搜索出内容呢?

而不是会匹配到HTML代码.

比如:如果我搜索关键字输入的是:   table

那么一些没有table字符串的而有表格的内容也将会搜索出来,这就会造成搜索结果的不准确,

请问该如何解决这个问题呢?



补充说明:用like的话是模糊的MYSQL查询

用regexp的话,是精确的查询

但好象都解决不了

另外,如果在DISCUZ5.5里面用编辑器模式,编辑内容的话,或者是输入  tableaaaaaaaaaa  这样字符串的贴子,再搜索  table 的时候,是搜索不到结果的,很奇怪呀,大家可以试试

另外,大家也可以输入  td,tr </td></tr> <tr   等进行测试, 总之用编辑器提交的含有网页格式的内容,再进行搜索,是很难做到准确的.
发表于 2007-8-12 02:41:19 | 显示全部楼层
你能,或者说你想告诉数据库,<table>里面不含有table字符?
慢慢筛吧.


where 1 like '%table%' and 1 not like '%<table>%'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-12 13:52:27 | 显示全部楼层
Post by nbxmedia
你能,或者说你想告诉数据库,<table>里面不含有table字符?
慢慢筛吧.


where 1 like '%table%' and 1 not like '%<table>%'


看来这确实是一个解决方法.
厉害啊,不愧是版主.


要是能够把类似  <        table        >  这样的也能解决,就更加完美了.
回复 支持 反对

使用道具 举报

发表于 2007-8-13 23:07:33 | 显示全部楼层
...AND 1 NOT LIKE '%< table >%'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-14 00:19:16 | 显示全部楼层
非常感谢上面两位高手的解答

不好意思,我发现还是解决不了:

比如有一段这样的代码: <table><tr><td>aaaaaatablebbbbb</td></tr></table>
那么如果这样搜:  where 1 like '%table%' and 1 not like '%<table>%'

是搜索不到的.
上面的只适合搜索只有: <table> 或者是只有: table的,如果两者混在一起在字段里面出现,那还是没法区分呀.

请大家再找下解决方法
回复 支持 反对

使用道具 举报

发表于 2007-8-14 10:07:35 | 显示全部楼层
发一个您存在数据库里的内容!
回复 支持 反对

使用道具 举报

发表于 2007-8-14 10:19:16 | 显示全部楼层
mysql正规表达式我不太熟..你可以.先用LIKE把对应条件的内容从数据库里取出来,这时取出的数据以经是符合查询条件的数据库,再用php把html的标签滤掉...或者用存储过程...我的想法..把你存在数据库里的内容提出贴上来一下,可能用更好的解决方法..
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-14 18:12:04 | 显示全部楼层
Post by jame298
发一个您存在数据库里的内容!


1,<table><tr><td>aaaaaatablebbbbb</td></tr></table>

2,<tr><td>aaaaaatablebbbbb</td></tr>

3,<table><tr><td>aa</td></tr></table>


假如上面是三条记录的内容,那么我需要能搜索到 1和2  的内容,该怎么定语句呢?

也就是说,只搜索内容中有字符串"table"  的,但不能搜索有"<table>" 这种html格式的.

nbx版主写的可以用在第2和第三条记录中,但到第一条记录就不适用了,因为 like table and not like <table>  这样是搜索不到第一条的,但第一条从逻辑上来说,是应该出现的,因为中间确实存在字符串"table"
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-8-14 18:19:44 | 显示全部楼层
Post by jame298
mysql正规表达式我不太熟..你可以.先用LIKE把对应条件的内容从数据库里取出来,这时取出的数据以经是符合查询条件的数据库,再用php把html的标签滤掉...或者用存储过程...我的想法..把你存在数据库里的内容提出贴上来一下,可能用更好的解决方法..



你说的先把MYSQL中的内容拿到数组中,再用PHP的字符串运算来过滤解决,当然是可以了

这样的话,用PHP的正则表达式,数组,排序函数等,连合使用,再复杂的要求也是可以实现的,甚至我只要用一个过滤HTML代码的函数就可以搞定

但是,有一个问题就是:我的这些过滤运算是要在取数据的时候完成的,要不然的话,就没法实现数据的分页读出了.

再者,如果数据库内有几十万条甚至百万条数据的话,难道我要把这些全一次性读出到数组中,然后一一比较运算吗?这是不现实的,也是不可能的.

请记住我们用PHP+MYSQL的一个首要前提条件:那就是:每次我们是来处理一页的符合条件的几十条数据的,哪怕是数据量再大,我们不可能一次用PHP来处理的,要是这样的话,就失去使用数据库的意义了.
回复 支持 反对

使用道具 举报

发表于 2007-8-15 01:15:53 | 显示全部楼层
mysql的正则不怎么地。你还是用php处理吧。
ps:你的这种要求也太诡异。一般我会存二份,一份纯文本格式,用php函数一下就搞定了。另一份存html格式。
剩下后面你爱怎么玩随便你。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表