首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >布尔搜索算子优化,尊重引用的条件

布尔搜索算子优化,尊重引用的条件
EN

Stack Overflow用户
提问于 2014-02-26 17:39:36
回答 2查看 76关注 0票数 1

寻找解析复杂搜索字符串的最优方法,并将其简化为在术语之间有一个布尔运算符。操作符是OR,AND,NOR。

例: 1.或和NOR,NOR,Fred OR,NOR,Wilma NOR,和Barney OR“AND AND Flintstone”OR AND NOR AND NOR AND and AND

或和NOR,NOR,Fred,NOR,Wilma,nor和Barney或“The AND AND Flintstone”OR AND NOR和和(由2014年3月至05日增补)

结果:

佛瑞德或威尔玛或巴尼或“和和弗林特斯通”

注意:我正在寻找PHP代码实现。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-26 18:55:16

您最好的选择是逐字读取输入并在状态机中处理它。

一些类似的东西:

代码语言:javascript
复制
define("STATE_DEFAULT", 0); // we're in regular text
define("STATE_OPERATOR", 1);  // we found operator (AND|OR|NOR)
define("STATE_QUOTE",2); // we're inside quoted text

$input = 'OR AND NOR NOR AND AND Fred OR NOR AND Wilma NOR AND AND Barney OR "The and AND Flintstones" OR AND NOR NOR AND AND';

// check if a word is an operator... used in multiple places 
function _is_op($word) { return preg_match("/^(AND|OR|NOR)$/i", $word); }

$words = explode(" ", $input);
$words_count = count($words);
$state = STATE_DEFAULT;

for($i=0; $i<$words_count; ++$i)
{
    $word = $words[$i];

    switch($state)
    {
         case STATE_QUOTE:
             if(substr($word,-1)=='"') $state = STATE_DEFAULT;
             break;

         case STATE_OPERATOR:
             if(_is_op($word))
             {
                 unset($words[$i]);
                 break;
             }

         case STATE_DEFAULT:
         default:
            $state = STATE_DEFAULT;
             if($word[0] == '"')
                 $state = STATE_QUOTE;
             elseif(_is_op($word))
                 $state = STATE_OPERATOR;
             break;
    }
}

// if we removed some words, count()-1 is no longer the last element
$words = array_values($words);

// strip operators from start and end
if(_is_op($words[0])) array_shift($words);
if(_is_op($words[count($words)-1])) array_pop($words);

$output = implode(" ", $words);

虽然使用正则表达式可以做到这一点,但它是复杂的,而且是很难管理的。

票数 2
EN

Stack Overflow用户

发布于 2014-02-26 19:26:38

代码语言:javascript
复制
Hope this will help:

$words = explode (" ", 'OR AND NOR NOR AND AND Fred OR NOR AND Wilma NOR AND AND Barney OR "The and AND Flintstones" OR AND NOR NOR AND AND');

$arrayOperators = array('OR', 'AND', 'NOR');

$flag = false;
foreach($words as $key => $word){
    if($flag && in_array($word, $arrayOperators)){
          unset($words[$key]);
    }elseif(in_array($word, $arrayOperators)){
       if($key != 0){
          $resultArray[] = $word;
        }
        $flag = true;

    }else{
        $resultArray[] = $word;
        $flag = false;
    }
}
end($resultArray);
$lastKey = key($resultArray);
if(in_array($resultArray[$lastKey], $arrayOperators)){
   array_pop($resultArray);
}

var_dump(implode(' ', $resultArray));

结果:

代码语言:javascript
复制
string(53) "Fred OR Wilma NOR Barney OR "The and AND Flintstones""
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22049050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档