-1

好的,我现在正在尝试扩展我之前在这里解决的一些代码。下面的这段代码分配了一个输入到搜索框中的短语,并尝试执行以下操作:1)清除我不想要的东西(注意:输入是预处理的,所以我现在只是省略更多,并且仍在这部分工作)。2) 使用空格作为分隔符将短语分成单独的单词 3) 检查提取的每个单独单词以查看前 3 个字符中是否存在 *,如果存在,则中止该过程 4) 检查单词“and”或“或”被使用——如果是这样,不加修改地应用它们——如果不是,那么在短语中插入一个“和”。(如果用户没有自己指定,最终会自动将短语转换为“and”短语)。5) 在整个过程中,

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 语句总是正确的?!无论我做什么,都会插入一个额外的“和”,无论上面的 if 语句是否为真。我已经验证了最初的 if 语句确实有效,它检测是否存在“和”或“或”并相应地应用它......但随后它继续处理 ELSEIF !我什至尝试过:

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

但最后,不管怎样,最终的短语都会以'and and's 或'or and's 结尾。

(注意:我意识到有比 preg_replace 更好的选择,但我会在其他时间研究 - 所以对于这个问题,我只是想解决 ELSEIF 困境,谢谢)


APPENDING MODS 基于响应...

所以,我将代码更改为...

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

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

“white football helmut”确实变成了“white and football and helmut”,然而……“white and football and helmut”变成了“white and and football and and helmut”。

如果if为真,我只是不明白ifelse如何处理?

注意:为了验证 IF 部分是否正常工作,我在该语句中放置了一个 x:

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

而“white and football and helmut”的结果是“white xand and football xand and helmut”。此外,“white and football helmut”(没有 2nd and)导致“white xand and football and helmut”。!!因此, IF 语句正在按预期处理 - 而不是 ELSEIF !

4

3 回答 3

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;
}
于 2011-04-25T16:32:57.473 回答
1

您需要检查当前和以前的标记都不是“和”/“或”。

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

使用“white and football helmut”,目前的逻辑是这样的:

  1. $keyword最初是“白色的”
  2. 下一个标记是“and”,所以它附加" "了标记"and"。现在 $keyword 是"white and".
  3. 下一个标记是“足球”,所以它附加了" and "plus "football"。现在 $keyword 是"white and and football".

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

于 2011-04-25T17:03:40.383 回答
0

我认为你在你的elif.

试试这个:

elseif ($keyword !== "and" && $keyword !== "or" && $token !== false)
于 2011-04-25T15:54:11.763 回答