用于MySQL全文搜索的转义字符串

chi*_*t24 15 mysql full-text-search laravel-4

我正在使用Laravel 4并设置了以下查询:

if(Input::get('keyword')) {
    $keyword = Input::get('keyword');
    $search = DB::connection()->getPdo()->quote($keyword);
    $query->whereRaw("MATCH(resources.name, resources.description, resources.website, resources.additional_info) AGAINST(? IN BOOLEAN MODE)", 
        array($search)
    );
}
Run Code Online (Sandbox Code Playgroud)

此查询在正常使用下运行正常,但是,如果用户输入字符串++,则会引发错误.纵观MySQL的文档,也有一些关键词,如+-具有特定用途.是否有一个函数可以从字符串中转义这些类型的特殊字符,因此它可以在上面的全文搜索中使用而不会抛出任何错误?

以下是抛出错误的示例:

{"error":{"type":"Illuminate\\Database\\QueryException","message":"SQLSTATE[42000]: Syntax error or access violation: 1064 syntax error, unexpected '+' (SQL: select * from `resources` where `duplicate` = 0 and MATCH(resources.name, resources.description, resources.website, resources.additional_info) AGAINST('c++' IN BOOLEAN MODE))","file":"\/var\/www\/html\/[...]\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Connection.php","line":555}}
Run Code Online (Sandbox Code Playgroud)

我试过的解决方案:

$search = str_ireplace(['+', '-'], ' ', $keyword);

$search = filter_var($keyword, FILTER_SANITIZE_STRING);

$search = DB::connection()->getPdo()->quote($keyword);
Run Code Online (Sandbox Code Playgroud)

我假设我需要使用正则表达式.这里最好的方法是什么?

Rim*_*mas 45

只有单词和运算符在布尔搜索模式中才有意义.运营商有:+,-,> <,( ),~,*,",@distance.经过一些研究,我发现字符是什么:大写字母,小写字母,数字(数字)和_.我想你可以使用以下两种方法之一:

  1. 用空格替换所有非单词字符(我更喜欢这种方法).这可以使用正则表达式完成:

    $search = preg_replace('/[^\p{L}\p{N}_]+/u', ' ', $keyword);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 用空格替换字符运算符:

    $search = preg_replace('/[+\-><\(\)~*\"@]+/', ' ', $keyword);
    
    Run Code Online (Sandbox Code Playgroud)

只有单词由全文搜索引擎索引并且可以搜索.非单词字符未编入索引,因此将它们留在搜索字符串中没有意义.

参考文献:

  • 是的,直到您必须搜索值为 ``&lt;label `` 或包含任何特殊字符的标签。这不是一个合适的答案。 (2认同)