【问题标题】:PHP boolean searchPHP 布尔搜索
【发布时间】:2012-05-06 02:55:07
【问题描述】:

我正在尝试将用户输入的字符串转换为 MySQL 布尔搜索。我有以下功能,它适用于多种场景,但不适用于双引号。

例如,它适用于以下字符串:

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;
}

【问题讨论】:

    标签: php regex boolean preg-split


    【解决方案1】:
    "technical writer" not "document manager"
    

    这个字符串不起作用,因为你没有从字符串中删除双引号

    使用trim 函数删除它们

    编辑

    使用TRIM 个人价值观,即“技术作家”、“文档管理员”

    点赞trim('"document manager"','"');

    【讨论】:

      【解决方案2】:

      你只需要删除你手动添加的双引号就可以了。

      比如这个

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

      因为那些双引号已经在输入字符串中了

      【讨论】:

        猜你喜欢
        • 2013-05-30
        • 2014-03-30
        • 1970-01-01
        • 1970-01-01
        • 2021-07-08
        • 2011-09-25
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        相关资源
        最近更新 更多