2014-02-11 57 views
0

我有一個有趣的問題,我似乎無法找到從哪裏開始。想象一下,我有一個完整的標準:如何正則表達式語言簡單查詢

field:(la blah theehe) field1:(ghgth) field2:(234) OR field:(thgt) sdfdsf dsfgf sdfg 

字符串剛剛從搜索中進來。

是否有正則表達式可靠的方法來有效地「分析」是查詢分解成一些更易於管理,如:

[ 
    "field:(la blah theehe)", 
    "field1:(ghgth)", 
    "field2:(234)", 
    "OR", 
    "field:(thgt)", 
    "sdfdsf dsfgf sdfg" 
] 

因此,從那裏我可以建立它的查詢,或者我想完全錯誤有了這個?

基本上所有字段的格式都是fieldName:(fieldValue),而字段之間的OR可以完全如此處理,字段之間的默認操作符是AND

對於那些不符合標準的部分,我通常會將它們視爲普通字符串。

我知道這是一個相當大的問題,甚至只是指針會非常好。

+1

爲什麼要使用正則表達式? – utdemir

+0

@utdemir它似乎是一個不錯的選擇,它們非常靈活,有更好的選擇嗎? – Sammaye

+0

在每個右括號之後進行分割')' - 將'OR'運算符包含在其中。這可能是您可以做的最好的。我感覺你不應該在這裏使用正則表達式來獲得「可靠」的解決方案。 –

回答

0

好吧,所以我認爲我有一個很好的答案,任何人糾正我,如果我錯了。很高興知道這將使用PHP函數,但正則表達式是重要的一部分。

@scrowlers的建議是好的,但拼寫錯誤和上下文等等呢?

所以我想到了: - 如果我能夠「提取」與字段標準完全匹配而沒有拼寫的查詢部分,我可以解析它。所有其他字符串將作爲關鍵字留下。所以,我想出了一個正則表達式來表達語法領域的標準化:

([a-z]+:\(.[^\)]*\)(\s+OR\s+|\s+or\s+)?) 

這基本上搜索領域,如果存在一個可選OR

對於我在循環中獲得的每個匹配,我將從原始搜索字符串中刪除該匹配項。這樣我就可以「提取」解析查詢。不僅如此,而且(至少在PHP中)匹配是爲了找到它們,這也意味着我的查詢不會通過運行這個正則表達式而被亂碼。

所以,現在,這意味着我可以運行:

listing:(1,2) title:(vid_) or mature:(1) deleted:(0) lala:(gfg ghffd 

如果沒有打破一切得到錯誤lala

最後一個問題是安全問題,我不得不確保我不只是盲目地拿着領域,並用它們來形成一個問題。要做到這一點,我和我的字段列表取代了原來的正則表達式的[a-z]+像這樣:

((field|date):\(.[^\)]*\)(\s+OR\s+|\s+or\s+)?) 

這意味着我現在可以運行此查詢:

field:(blajh blah bla) or field:(sdfdf) sdgff sdg fd date:(12022013 TO 12062013) fiedl1:(lala) date:(2 TO 5) 

而且fiedl1不會拿出的比賽。

我相信解決了我所有的問題,讓我知道如果我錯了。

感謝您的幫助,