2012-12-16 71 views
1

我發現這個答案 - https://stackoverflow.com/a/7943464/1901367 - 這給了我這個非常有用的代碼,讓我解析包含引號和空格的搜索字符串。使用REGEX解析搜索字符串與布爾運營商

preg_match_all('/(?<!")\b\w+\b|(?<=")\b[^"]+/', $subject, $result, PREG_PATTERN_ORDER); 

我想知道,如果有人能告訴我如何改變這種代碼,以便它會離開布爾運算符,如+和 - 不變,因爲當前的代碼剝離出來。

我想做我的數據庫的全文布爾搜索使用這些運算符,我很困惑這個REGEX,我不明白。

示例輸入和輸出。

輸入:'「這是一些」這裏的文本是 - 更多 - 「exlude me」' 輸出:[這是一些] [文本] [這裏] [是] [ - 更多] [ - 排除我]這些將會出現在$ result數組中

因此,由空格分隔的所有內容都是單個項目,除非它是用「」括起來的短語。這已經有效,但是我擁有更多和更多的「排除我」,目前的結果是[更多]和[排除我]失去了我想保留的負號。

在此先感謝!

+1

請提供例如輸入和這些輸入您的預計產出。 –

+0

完成,我已將它添加到問題 –

回答

1

你可以使用一個簡單的正則表達式來抽出令牌,引號和其中的所有內容,然後在使用它們之前讓它們漂亮起來。事情是這樣的:

function query_tokens($query) 
{ 
    $regex = '/-?"[\pL\s]+"|-?\pL+/'; 

    preg_match_all($regex, $query, $tokens, PREG_SET_ORDER); 

    foreach ($tokens as & $token) 
    { 
     $token = array_shift($token); 

     $modifier = NULL; 

     if ($token[0] === '-' || $token[0] === '+') 
     { 
      $modifier = $token[0]; 

      $token = substr($token, 1); 
     } 
     if ($token[0] === '"') 
     { 
      $token = trim($token, '"'); 
     } 
     $token = $modifier.$token; 
    } 

    return $tokens; 
} 

使用的字符串和函數的結果:

var_dump(query_tokens('"this is some" text here is -more -"exlude me"')); 
array (size=6) 
    0 => string 'this is some' (length=12) 
    1 => string 'text' (length=4) 
    2 => string 'here' (length=4) 
    3 => string 'is' (length=2) 
    4 => string '-more' (length=5) 
    5 => string '-exlude me' (length=10) 

正則表達式是偉大的,但有時他們可以使事情複雜得多,他們需要。

+0

謝謝,我稍後再試一試 –

1

您無法使用正則表達式捕獲'-exclude me',因爲匹配始終是連續的。在最好的情況,你可以修改正則表達式的「 - 更」令牌匹配這樣:

(?<!")-?\b\w+\b|(?<=")\b[^"]+

+0

嗯,我明白了,謝謝你的回答 –