寻找解析复杂搜索字符串的最优方法,并将其简化为在术语之间有一个布尔运算符。操作符是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代码实现。
发布于 2014-02-26 18:55:16
您最好的选择是逐字读取输入并在状态机中处理它。
一些类似的东西:
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);虽然使用正则表达式可以做到这一点,但它是复杂的,而且是很难管理的。
发布于 2014-02-26 19:26:38
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));结果:
string(53) "Fred OR Wilma NOR Barney OR "The and AND Flintstones""https://stackoverflow.com/questions/22049050
复制相似问题