2012-04-25 90 views
0

我試圖將用戶輸入的字符串轉換爲MySQL布爾搜索。我有以下功能可以完美適用於多種場景,但它不適用於雙引號。PHP布爾搜索

的String1:技術不是經理 String2的:

因此,例如,它具有以下字符串工作原理的技術或管理人員或管理

這是不對的,現在的工作只有一個,就是當你進入一個用雙引號括住的短語。例如:

STRING3(不工作): 「技術作家」 而不是 「文件管理器」

下面是我使用的功能:

function booltostring($input) 
{ 
    $input = strtolower($input); 
    $out = ""; 
    $plusflag = false; 
    $minusflag = false; 

    $forms = preg_split("%(and|or|not)%",$input,-1,PREG_SPLIT_DELIM_CAPTURE); 
    $forms = array_map('trim',$forms); 

    for($i = 0; $i < count($forms); $i++) 
    { 
     switch($forms[$i]) 
     { 
      case 'and': 
       $plusflag = true; 
       $minusflag = false; 
       if(count(explode(' ',$forms[$i+1])) > 1) 
       { 
        $out .= '"+'.$forms[$i+1].'" '; 
       } 
       else 
       { 
        $out .= "+".$forms[$i+1]." "; 
       } 
       $i++; 
      break; 
      case 'or': 
       if(strpos($forms[$i-1],'OR')>-1 || strpos($forms[$i-1],'or')>-1) 
       { 
        $plusflag = true; 
       } 
       if(count(explode(' ',$forms[$i+1])) > 1) 
       { 
        $out .= '"'.(($minusflag) ? "-" : "").$forms[$i+1].'" '; 
       } 
       else 
       { 
        $out .= (($minusflag) ? "-" : "").$forms[$i+1]." "; 
       } 
       $i++; 
      break; 
      case 'not': 
       $plusflag = false; 
       $minusflag = true; 
       if(count(explode(' ',$forms[$i+1])) > 1) 
       { 
        $out .= '"-'.$forms[$i+1].'" '; 
       } 
       else 
       { 
        $out .= "-".$forms[$i+1]." "; 
       } 
       $i++; 
      break; 
      default: 
       if(strpos($forms[$i+1],'OR')>-1 || strpos($forms[$i+1],'or')>-1) 
       { 
        $plusflag = false; 
       } 
       if(strpos($forms[$i+1],'AND')>-1 || strpos($forms[$i+1],'and')>-1) 
       { 
        $plusflag = true; 
       } 
       if(count(explode(' ',$forms[$i])) > 1) 
       { 
        $out .= (($plusflag) ? "+" : "")."\"".$forms[$i]."\" "; 
       } 
       else 
       { 
        $out .= (($plusflag) ? "+" : "").$forms[$i]." "; 
       } 
      break; 
     } 
    } 
    $out = trim($out); 

    return $out; 
} 

回答

0
"technical writer" not "document manager" 

此字符串不工作因爲您沒有刪除字符串中的雙引號

通過使用trim功能

編輯

使用TRIM論個人價值觀,即「技術作家」,「文件管理器」

喜歡這個trim('"document manager"','"');

0

你只需要刪除您手動,然後加入雙引號它應該沒有問題。

例如,這一個

$out .= '"+'.$forms[$i+1].'" '; 

由於這些雙引號已經在輸入字符串