2012-04-25 1 views
0

Я пытаюсь преобразовать введенную пользователем строку в логический поиск MySQL. У меня есть следующая функция, которая отлично работает для ряда сценариев, однако она не работает с двойными кавычками.PHP boolean search

Так, например, он работает со следующими строками:

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 функция

EDIT:

USE TRIM На индивидуальных значений, то есть «технический писатель», «менеджер документа»

Как это trim('"document manager"','"');

0

Вам просто нужно удалить двойные кавычки вы добавляете вручную, а затем это не должно быть проблемой.

Например, это один

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

Поскольку эти двойные кавычки уже во входной строке