最近公司要求网站的搜索功能增加将关键字过虑所有标点符号(包括中英文标点符号)后再进行数据库的查询操作,心想这还不容易,PHP的强大函数立即体现,PHP就是强大(哈哈,跑题了),一个正则搞定。
例子:
$keyword='阿’凡;提,美。食,城 ';
$keyword=preg_replace("/[~`!@#$%^&*()_+|\=-}{[]":;'?><,./?》《,。、“”:;‘’=—()|…¥·!]+/",'',$keyword);
echo $keyword;
//输出结果:阿凡提美食城
是不是很简单?我也以为是这么简单,但接下来郁闷了。
某些文字过虑后出现了乱码,例如:海、厅等等,经研究发现,这些中文与某些中文的标点符号的部分编码是相同的,所以过虑后造成文字不完成而乱码。
去掉这些中文标点符号是可以解决问题,但就达不到过虑效果了。
郁闷了两天,今天一早突发灵感,居然是文字与标点符号编码的某部分相同被过滤了,那么将他们先编码后,用正则完成匹配标点符号的编码才过滤就可以啦。想到就做。
将所有标点符号先编码,每个符号的完整编码用(|)隔开,如下:%7E|%60|%21|%40|%23|%24|%25|%5E|%26|%27|%2A|%28|%29|%2B|%7C|%5C|%3D|\-|_|%5B|%5D|%7D|%7B|%3B|%22|%3A|%3F|%3E|%3C|%2C|\.|%2F|%A3%BF|%A1%B7|%A1%B6|%A1%A2|%A1%A3|%A3%AC|%7D|%A1%B0|%A3%BA|%A3%BB|%A1%AE|%A1%AF|%A1%B1|%A3%FC|%A3%BD|%A1%AA|%A3%A9|%A3%A8|%A1%
例子:
$keyword='阿’凡;提,美。食,城 ';
$keyword=preg_replace("/[~`!@#$%^&*()_+|\=-}{[]":;'?><,./?》《,。、“”:;‘’=—()|…¥·!]+/",'',$keyword);
echo $keyword;
//输出结果:阿凡提美食城
是不是很简单?我也以为是这么简单,但接下来郁闷了。
某些文字过虑后出现了乱码,例如:海、厅等等,经研究发现,这些中文与某些中文的标点符号的部分编码是相同的,所以过虑后造成文字不完成而乱码。
去掉这些中文标点符号是可以解决问题,但就达不到过虑效果了。
郁闷了两天,今天一早突发灵感,居然是文字与标点符号编码的某部分相同被过滤了,那么将他们先编码后,用正则完成匹配标点符号的编码才过滤就可以啦。想到就做。
将所有标点符号先编码,每个符号的完整编码用(|)隔开,如下:%7E|%60|%21|%40|%23|%24|%25|%5E|%26|%27|%2A|%28|%29|%2B|%7C|%5C|%3D|\-|_|%5B|%5D|%7D|%7B|%3B|%22|%3A|%3F|%3E|%3C|%2C|\.|%2F|%A3%BF|%A1%B7|%A1%B6|%A1%A2|%A1%A3|%A3%AC|%7D|%A1%B0|%A3%BA|%A3%BB|%A1%AE|%A1%AF|%A1%B1|%A3%FC|%A3%BD|%A1%AA|%A3%A9|%A3%A8|%A1%