PHP如果Else语句无论如何都是真的

时间:2011-04-25 15:37:01

标签: php string strtok if-statement

好的,我现在正在尝试扩展我之前解决过的一些代码。 下面的代码将一个短语分配到搜索框中,并尝试执行以下操作: 1)清理我不想要的东西(注意:输入是经过预处理的,所以我现在只需要更多的东西,并且仍在处理这部分)。 2)使用空格作为分隔符将短语分成单个单词 3)检查提取的每个单词,以查看前3个字符中是否存在*,如果是,则中止该过程 4)检查是否使用了“和”或“或” - 如果是,则不加修改地应用它们 - 如果不是,则在短语中插入“和”。 (如果用户没有自己指定,最终会自动将短语转换为“和”短语)。 5)在整个过程中,$ keyword被重建,最后我回显最后的新$关键字来测试结果......当然,随后会使用新的关键字更多代码。

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) 

但最终,所产生的短语最终会以'和'或'或者和'结束,无论如何。

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


附加MODS基于回复......

所以,我把代码改为......

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

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

“白色足球赫尔穆特”确实变成了“白色足球和赫尔穆特”, 然而... “白色,足球和赫尔穆特”变成了“白色,足球和赫尔穆特”。

如果if为真,我只是看不到ifelse如何处理?

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

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

“白色和橄榄球和赫尔穆特”导致“白色xand和橄榄球xand和helmut”。此外,“白色和橄榄球头盔”(没有第二和)导致“白色xand和橄榄球和赫尔穆特”。 !因此,IF语句按预期处理 - 只是不是ELSEIF !!

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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"。现在$ keyword是"white and"
  3. 下一个标记是“足球”,因此它会附加" and ""football"。现在$ keyword是"white and and football"
  4. 这就是你如何获得双重“和”。检查当前和前一个令牌,以避免连续“和”/“或”。

答案 2 :(得分:0)

我认为您正在检查elif中的错误变种。

请改为尝试:

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