2014-10-22 70 views
8

我使用Laravel 4,並建立了下面的查詢轉義字符串:對MySQL的全文搜索使用

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) 
    ); 
} 

此查詢運行正常使用情況下正常,但是,如果用戶輸入一個字符串,如++ ,會引發錯誤。看看MySQl docs,有一些關鍵字,如+-,它們有特定的用途。有沒有一個函數可以將字符串中的這些類型的特殊字符轉義出來,因此可以像上面那樣在全文搜索中使用,而不會引發任何錯誤?

這裏是一個被拋出一個錯誤的例子:

{"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}} 

解決方案我已經試過:

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

$search = filter_var($keyword, FILTER_SANITIZE_STRING); 

$search = DB::connection()->getPdo()->quote($keyword); 

我假設我將需要使用正則表達式。這裏最好的方法是什麼?

+0

你會想逃避,而不是刪除。 – rmobis 2014-10-22 14:45:59

+0

對,那會更好。是否有任何函數會轉義像'+'和'-'這樣的特殊字符? – chipit24 2014-10-22 14:55:55

+0

但是,如果這些特殊字符被轉義,它們會在搜索中有用嗎? – chipit24 2014-10-22 14:59:05

回答

32

只有詞和運算符在布爾搜索模式中有意義。運營商:+-> <()~*"@distance。經過一番研究,我發現了什麼字符是:大寫字母,小寫字母,數字(數字)和_。我認爲你可以使用兩種方法之一:

  1. 用空格替換所有非單詞字符(我更喜歡這種方法)。這可以用正則表達式來完成:

    $search = preg_replace('/[^\p{L}\p{N}_]+/u', ' ', $keyword); 
    
  2. 用空格字符替換運營商:

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

只有文字,被全文搜索引擎收錄,可以進行搜索。非單詞字符沒有編入索引,所以將它們留在搜索字符串中是沒有意義的。

參考文獻: