2011-04-25 81 views
-1

好吧,我现在试图展开一些我以前在这里解决过的代码。 下面的这段代码指定了一个输入到搜索框中的短语,并尝试执行以下操作: 1)清除我不想在其中的东西(注意:输入是预处理的,所以我只是为了现在,仍然在这部分工作)。 2)用空格作为分隔符将短语分解成单独的单词 3)检查提取的每个单词是否存在于前3个字符中,如果是,则中止处理 4)检查单词“和“或”or“被使用 - 如果是这样,则不加修改地应用它们 - 如果没有,则插入”和“到短语中。 (如果用户没有自己指定,最终会自动将短语转换为“和”短语)。 5)在整个过程中,$关键字被重建,最后我回应最终的新的$关键字来测试结果......当然更多的代码在使用那个新的关键字。PHP Ifelse声明是真实的,无论

if ($keyword) { 

      $clean = preg_replace('/[^a-zA-Z0-9 *_&]/','',$keyword);    
      $token = strtok($clean, " "); 

      $keyword = $token; 

      while ($token !== false) { 
       $pos = stripos($token, "*"); 
       if ($pos < 3 && $pos !== false) { 
       return; 
       } 
      $token = strtok(" "); 
       if ($token == "and" || $token == "or") { 
        $keyword = $keyword . " " . $token; 
       } elseif ($token) { 
        $keyword = $keyword . " and " . $token; 
       } 
      } 
      echo $keyword; 

问题:

一切工作正常,但由于某些原因ELSEIF语句总是正确的?无论我做什么,都会插入额外的'and',而不管上面的if语句是否为true。我已经验证了最初的if语句是否有效,它检测'and'或'or'是否存在并相应地应用它......但是,它继续前进并处理ELSEIF!我甚至想尽办法:

elseif ($token !== "and" && $token !== "or" && $token !== false) 

但是最终,最终结果是'和和或或'或和,无论如何。

(注:我知道有比preg_replace函数更好的选择,但我会寻找到,在另一个时间 - 所以对于这个问题,我只是试图解决ELSEIF困境,感谢)


追加基于响应MODS ...

于是,我改变了代码...

$token = strtok(" "); 
       if (in_array($token, array('and', 'or'))) { 
        $keyword = $keyword . " " . $token; 
       } elseif (!empty($token)) { 
        $keyword = $keyword . " and " . $token; 
       } 

但结果仍然不正确。例如:

“白色足球helmut”确实成为“白色和足球和helmut”,然而... “白色和足球和helmut”变成“白色和足球和helmut”。

我只是不明白如果if是真的ifelse可以如何处理?

注意:要验证IF部分的工作,我放置在语句中的X:

if (in_array($token, array('and', 'or'))) { 
        $keyword = $keyword . " x" . $token; 

与“白和足球和赫尔穆特”导致“白色x和和足球x和和赫尔穆特”。此外,“白色和足球helmut”(没有第二和)导致“白色和足球和helmut”。 !所以,IF语句正在按预期处理 - 只是不是ELSEIF!

+1

只是说明一下,我想你可能已经在第二个'/'之前的正则表达式中错过了关闭']'。 – 2011-04-25 16:28:00

+0

好的 - 我在实际的代码中有更多内容,但是由于它是一项正在进行的工作,因此在此消息中删除了大部分内容 - 并意外地删除了这些内容。它现在回到那里;-)谢谢 – Soyo 2011-04-25 16:32:29

回答

1

您需要检查当前令牌和先前令牌不是“和”/“或”。

$prevToken = $token; 
$token = strtok(" "); 
    if ($token == "and" || $token == "or" 
     || $prevToken == "and" || $prevToken == "or" 
    ) { 
     $keyword = $keyword . " " . $token; 
    } elseif ($token) { 
     $keyword = $keyword . " and " . $token; 
    } 

使用“白色和足球赫尔穆特”,逻辑目前是这样的:

  1. $keyword最初是“白”
  2. 下一个标记是“和”,所以它追加" "加代币"and"。现在$关键字是"white and"
  3. 下一个令牌是“足球”,所以它附加" and ""football"。现在$关键字是"white and and football"

所以这就是你如何得到双“和”。检查当前和以前的标记以避免连续的“和”/“或”。

+0

Ahhhhhhh .... ;-)我已经可以告诉这将工作。我怎么没有看到这一点!森林再次从树上。我会插入并测试它,并很快回复到这里...谢谢 – Soyo 2011-04-25 17:31:46

+0

是的,这个工程很好,并且满足了每个需求......感谢Wiseguy,你绝对不会辜负你的名字;-) – Soyo 2011-04-25 23:04:55

0

我想你正在检查elif错误的var。

试试这个:

elseif ($keyword !== "and" && $keyword !== "or" && $token !== false) 
+0

感谢您的回应!那么,如果我要检查$关键字,它将检查整个构造到那一点,因为$关键字正在慢慢建立,因为while过程继续...所以我想用elseif做的事情是说“好的,$ token不是“和”,并且不是“或”,只要它不是空的,就把它追加到$关键字前面的“和”前面。 – Soyo 2011-04-25 16:02:08

+0

最终目标是,如果用户输入“白色足球helmut”,这将返回“白色和足球和helmut”。但是,如果他们输入“白色和橄榄球helmut”,这应该认识到他们使用了,并且由此产生的短语=“白色和足球和helmut”,而不是“白色和和橄榄球和helmut”...希望这是有道理的... – Soyo 2011-04-25 16:04:41

2

@Soyo:尝试这​​一点 -

if ($token == 'and' || $token == 'or') { 
    // do nothing here to avoid duplicating 'and' 
} 
elseif (!empty($token)) { 
    $keyword = $keyword . ' and ' . $token; 
} 

更新

这是我用来测试脚本 -

$keyword = 'white and and or and football and or helmut and'; 

if ($keyword) 
{ 
    $clean = preg_replace('/[^a-zA-Z0-9 *_&]/', '', $keyword); 
    $token = strtok($clean, ' '); 
    $keyword = $token; 

    while ($token !== false) 
    { 
     $pos = stripos($token, '*'); 

     if ($pos < 3 && $pos !== false) 
     { 
      return; 
     } 
     $token = strtok(' '); 

     if (in_array(strtolower($token), array('and', 'or'))) { 
      // do nothing here! 
     } elseif (!empty($token)) { 
      $keyword = $keyword . ' and ' . $token; 
     } 
    } 
    echo $keyword; 
} 
+0

你可以用if(in_array($ token,array('和','或')){... 来取代第一行以获得更简洁的检查。 – SuitedSloth 2011-04-25 16:36:09

+0

好吧,我做了几个mod和将附加到原来的问题... – Soyo 2011-04-25 16:48:15

+0

注意:仍然无法正常工作,请参阅上面的更新:-( – Soyo 2011-04-25 16:55:53