CakePHP / Croogo:搜索带有一些特殊字符的字符串不会返回任何结果

时间:2013-04-19 12:50:57

标签: cakephp croogo

我注意到在搜索带有一些非ascii字符的单词时,Croogo的NodesController :: search()中存在一个错误,例如: “UAO”。如果我搜索'Steuergeräte'(德语)的例子,我得不到任何结果,即使我应该。如果我搜索'Steuergerate'(用德语拼写错误),我会得到想要的结果。这完全是奇怪的。

对db我的直接查询工作正常:

“SELECT * FROM i18n WHERE content LIKE'%Steuergeräte%';”

返回预期记录。

但是这不是unicode-chars的一般问题,例如,搜索日语单词按预期工作。所以这只会影响一些字符。

Cakephp:2.4.0,Croogo:1.4.5

1 个答案:

答案 0 :(得分:0)

好的,我找到了问题的原因。

在搜索视图中,使用以下内容清除要搜索的字符串:

     $q = Sanitize::clean($this->request->params['named']['q']);

当设置'encode' => true时,默认情况下,默认情况下,字符串中的html_entities会运行html_entities。这会变成例如ö进入ö,然后在其上搜索带有html实体的字词。

我做了一个解决方法:

     $q = $this->request->params['named']['q'];
     // Use encode=false on Sanitize::clean to prevent äüöß etc. getting
     // replaced by html entities. And strip tags manually first to prevent
     // html injected strings.
     $q = strip_tags($q);
     $q = Sanitize::clean($q, array('encode' => false));

注意:如果像我的情况一样,TinyMCE设置为'entity_encoding' => 'raw'那么节点表中的正文字段也会包含äöü而不是htmlentities,IMO要好得多练习用htmlentities取代它们。但默认情况下,tinymce用htmlentities替换chars,因此body字段可以使用Croogo / Cakephp的默认搜索行为。但是,例如,在标题字段中搜索不会。

<强>更新

好的,正如标记评论建议的那样,不需要消毒和使用cake的paginate方法,因此可以跳过Sanitize部分。我还发现使用htmlspecialchars甚至更好地作为strip_tags,因为strip_tags不会照顾例如'&amp;',在身体上,tinyMCE将这些保存为html_entities。所以更新后的代码如下所示:

     $q = htmlspecialchars($this->request->params['named']['q']);
     // go on with searching for nodes on paginate-method