2011-02-27 55 views
0


我試圖建立一個搜索系統和檢索匹配的記錄。在這種情況下..我想讓用戶使用一些特殊的字符準確地建立他們的請求。所以我把這些標誌,然後把它們轉換成一個正確的SQL:
+應轉換RO
/應轉換RO OR
應轉換RO
例如用戶輸入時:「書/筆」 +紙
它應轉換爲SQL WHERE CLA使用:
((MyField的如 「%書%」)OR(MyField的如 「%筆%」))AND(MyField的如 「%紙%」)
我實現這與開關殼體和數組..但我想還有另一種快速的方法來做到這一點(如regEx)。你有解決它的想法嗎?

注1:我應該收集該表達式的所有項並將其保存在另一個表。所以,我需要將它們收集在一個數組中。
注2:條款可以在所有的世界語言寫!從英語到阿拉伯語,波斯語,..可能是中國人!


謝謝PHP:如何分析搜索表達式和檢索值?

+0

之間有什麼區別/和」 – emaillenin 2011-02-27 08:01:06

+0

引號意味着括號,將覆蓋定義的運算符優先級在表達,但削減手段或以SQL語法。 – cxForce 2011-02-27 19:19:35

回答

1

有一試:

$str = '"book/pen"+paper'; 
// First: replace all keywords (assuming they don't contain "/+ by SQL LIKE 
$str = preg_replace('#([^"/+]+)#', "(myfield LIKE '%$1%')", $str); 
// then replace/by OR 
$str = preg_replace("#/#", " OR ", $str); 
// then replace + by AND 
$str = preg_replace("#\+#", " AND ", $str); 
// and finaly replace pair of "" by() 
$str = preg_replace('/"([^"]+)"/', "($1)", $str); 
echo $str,"\n"; 

輸出:

((myfield LIKE '%book%') OR (myfield LIKE '%pen%')) AND (myfield LIKE '%paper%') 
+0

神奇......我測試一下吧!w ^與所有語言的orks。但是..因爲注1,是否有任何方法將所有的「/ +轉換爲像#這樣的字符串,然後爆炸字符串以檢索所有字?(例如」book/pen「+紙轉換爲#book#pen#紙) - (例如,「紅色的天空/日落」 - > #red sky#sunset) – cxForce 2011-02-27 20:17:09

+0

thnx ...我解決這個問題的方法是混合你的優秀方法和preg_replace_callback()來檢索每個術語並操作它們!你是最好的:) – cxForce 2011-02-27 21:02:30

0

考慮到您的示例「書/筆」+紙,以下步驟應該工作。

$sourceQuery = '"book/pen"+paper'; 
    $targetQuery = preg_replace(
        '/^"(.*)[//](.*)"[/+](.*)$/', 
        '((myfield LIKE "%$1%") OR (myfield LIKE "%$2%")) AND (myfield LIKE "%$3%")', 
        $sourceQuery); 

要在您的源查詢匹配的地方不止一個運營商,使用模式的範圍,例如[\ | +] 閱讀preg_replace匹配任何一種你希望使用的模式。

對於語言問題,而使用非英語語言有你遇到的任何問題。

+0

THX emaillenin..but我應該找到一種方法,可以在所有的搜索表達式,也不只是這樣回答。 – cxForce 2011-02-27 19:58:20