PHP Ifelse утверждение верно независимо - PullRequest
0 голосов
/ 25 апреля 2011

Хорошо, сейчас я пытаюсь расширить часть кода, который я здесь разрешил ранее. Этот код ниже назначает фразу, введенную в поле поиска, и пытается сделать следующее: 1) вычистить то, что мне там не нужно (ПРИМЕЧАНИЕ: вход предварительно обработан, поэтому я просто пока еще не закончил и продолжаю работать над этой частью). 2) разбить фразу на отдельные слова, используя пробелы в качестве разделителя 3) проверьте каждое отдельное слово, извлеченное, чтобы увидеть, существует ли * в первых 3 символах, и, если это так, прервать процесс 4) проверьте, используются ли слова «и» или «или» - если да, примените их без изменений - если нет, то добавьте «и» к фразе. (Конечное преобразование фразы в фразу «и» автоматически, если пользователь не указал ее самостоятельно). 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) 

Но, в конце концов, получающаяся фраза заканчивается на «и и или или» или и, независимо от того.

(Примечание: я понимаю, что есть лучшие варианты, чем preg_replace, но я рассмотрю это в другой раз - поэтому для этого вопроса я просто пытаюсь разрешить дилемму ELSEIF, спасибо)


ПРИЛОЖЕНИЕ МОДОВ На основе ответов ...

Итак, я изменил код на ...

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

Но результаты все еще неверны. Например:

"белый футбольный шлем" становится "белым и футбол и шлем", тем не мение... "белый и футбол и хельмут" становится "белым и футбол и хельмут".

Я просто не понимаю, как ifelse может обрабатывать, если if - true ??

Примечание. Чтобы убедиться, что часть IF работает, я поставил в этом выражении x:

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

А "белый и футбол и хельмут" приводит к "белый и Xand и футбольный хэнд и helmut". Кроме того, «белый и футбольный хельмут» (не 2-й и) приводит к «белым хэнд и футбол и хельмут». !! Итак, оператор IF обрабатывается, как и ожидалось - только не ELSEIF !!

Ответы [ 3 ]

2 голосов
/ 25 апреля 2011

@ Сойо: попробуйте это -

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 голос
/ 25 апреля 2011

Вам нужно проверить, что и текущий, и предыдущий токены не являются "и" / "или".

$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".Теперь ключевое слово $ - "white and".
  3. Следующий токен - "футбол", поэтому он добавляет " and " плюс "football".Теперь ключевое слово $ равно "white and and football".

Так вот, как вы получаете двойные "и".Проверьте текущие и предыдущие токены, чтобы избежать последовательных «и» / «или».

0 голосов
/ 25 апреля 2011

Я думаю, что вы проверяете неправильную переменную в вашем elif.

Попробуйте вместо этого:

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