|
第一次用CI开发项目,由于用到这样的中文搜索功能,在URL处理上百思不得其解,在论坛上看到
CI中的URL中是不是不可以出现中文?
这贴子,Hex回复说要修改$config['permitted_uri_chars'] 这个配置
偶在里添了处理中文的正则表达式\u4e00-\u9fa5
PHP复制代码 $config['permitted_uri_chars'] ='a-z 0-9~%.:_-\u4e00-\u9fa5'; 复制代码
结果显示错误:
preg_match() [function.preg-match]: Compilation failed: range out of order in character class at offset 18
google了一下把配置改成了
PHP复制代码 $config['permitted_uri_chars'] = 'a-z 0-9~%.:_-x00-xff'; 复制代码
还是不出结果
实在无奈之下加了CI中文社区管理员Hex的QQ,在他的提示下,我试着修改
Router.php,
找到
这就是我们要修改的地方
百度查了一下,发现preg_match扩展正则表达式函数对utf-8中文支持并不是很友好
翻了翻PHP手册发现mb_ereg(Multibyte String Functions)、preg_match(POSIX 扩展正则表达式函数)、ereg(Perl 兼容正则表达式函数)这三类字符串处理函数区别,
Multibyte String Functions支持双字节字符串,
Perl 兼容正则表达式函数比POSIX 扩展正则表达式函数更快,
如果这样的话是否POSIX 扩展正则表达式函数就没必要使用了?
没想太多,赶快换成mb_ereg试试
PHP复制代码 if ( ! mb_ereg("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str)) 复制代码 终于显示正常了
修改步骤:
1、./system/app/config/config.php找到$config['permitted_uri_chars'] 修改
成$config['permitted_uri_chars'] = 'a-z 0-9~%.:_-x00-xff';
或$config['permitted_uri_chars'] ='a-z 0-9~%.:_\u4e00-\u9fa5';
或$config['permitted_uri_chars'] ='[\x01-\x7f]¦[\xc2-\xdf][\x80-\xbf]¦[\xe0-\xef][\x80-\xbf]{2} ¦[\xf0-\xff][\x80-\xbf]{3}';
2、./system/libraries/Router.php找到修改成PHP复制代码 if ( ! mb_ereg("|^[".preg_quote($this->config->item('permitted_uri_chars'))."]+$|i", $str)) 复制代码
3、大功告成,现在的您的CI支持utf-8中文地址了
4、如果你的文件编码全是utf-8的在搜索结果页加上
$keyword = iconv("gb2312","utf-8",$this->uri->segment(3));
不明白的地方联系我:QQ:153214903 |
评分
-
查看全部评分
|