2011-04-25 6 views
-1

좋아, 이제 이전에 여기서 해결 한 코드를 확장하려고합니다. 아래 코드는 검색 창에 입력 한 문구를 할당하고 다음을 시도합니다. 1) 내가 원하지 않는 내용을 정리합니다 (참고 : 입력이 사전 처리되어 더 많은 내용을 처리하고 있습니다. 지금,이 부분에서 계속 작업하고 있습니다). 2) 분리 기호로 공백을 사용하여 개별 단어로 구문을 분리하십시오. 3) 추출 된 각 개별 단어를 확인하여 첫 3 자 안에 a *가 있는지 확인하십시오. 그렇다면 프로세스를 중단하십시오. 4) 단어 "and "또는"or "가 사용 된 경우 수정없이 적용하십시오. 그렇지 않으면 구문에"and "를 삽입하십시오. (궁극적으로 사용자가 직접 지정하지 않으면 구문을 자동으로 "and"구문으로 변환합니다. 5) 프로세스 전체에서 $ 키워드가 재구성되고 결과적으로 최종 $ new 키워드가 에코됩니다. 물론 새로운 키워드를 사용하면 더 많은 코드가 생성됩니다.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 문은 항상 TRUE입니다 몇 가지 이유를 제외하고 잘 작동! 내가하는 일과 상관없이 위의 if 문이 true인지 아닌지에 관계없이 추가 'and'가 삽입됩니다. 초기 if 문이 작동하는지 확인한 후 'and'or 'or'가 있는지 여부를 감지하여 적절하게 적용하는지 확인한 다음 어쨌든 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; 
       } 

을 응답에 기반 MODS를 추가하지만 결과는 여전히 올바르지 않습니다. 예 :

"white football helmut"은 "white and football and helmut"이됩니다. 그러나 "white and football and helmut"은 "white and and football and helmut"이됩니다.

나는 ifelse가 처리 될 수있는 방법을 알지 못한다.

참고 : IF 부분이 작동하는지 확인하려면, 그 문에 X 배치 : "흰색 xand 축구 xand와 헬무트"에

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

그리고 "흰색과 축구와 헬무트"결과. 또한, "백인과 축구 헬무트"(2 위와 2 위 없음) 결과는 "백인과 축구와 헬무트"입니다. !! !! 따라서 IF 문은 예상대로 처리됩니다. ELSEIF가 아닙니다!

+1

그냥 두 번째'/'앞의 정규식에서 닫는']'을 놓친 것 같습니다. –

+0

좋은 캐치 - 실제 코드에는 더 많은 정보가 있었지만 진행중인 작업 이었기 때문에이 메시지에서 대부분 제거되었습니다. 실수로이 코드를 잘라 냈습니다. 이제 다시 돌아 왔습니다 .-) 감사합니다. – Soyo

답변

1

현재 토큰과 이전 토큰이 모두 "and"또는 "or"이 아닌지 확인해야합니다. "흰색과 축구 헬무트"를 사용

$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. 다음 토큰은 "football"이므로 " and ""football"을 추가합니다. 이제 $ 키워드는 "white and and football"입니다.

이렇게하면 "and"가 두 배가됩니다. 연속 된 "및"/ "또는"을 피하려면 현재 토큰과 이전 토큰을 모두 확인하십시오.

+0

Ahhhhhhh .... ;-) 나는 이것이 작동 할 것이라고 이미 말할 수 있습니다. 나는 그것을 어떻게 보지 않고 있었느냐! 다시 나무 숲. 여기에 플러그를 꽂아 시험해 보시고 곧 답변 드리겠습니다. 감사합니다. – Soyo

+0

네, 위대한 작품이며, 각 요구 사항을 ... 감사합니다 Wiseguy, 당신은 확실히 당신의 이름을 살았습니다 ;-) – Soyo

0

나는 당신이 elif에서 잘못된 var를 확인하고 있다고 생각합니다.

대신을 시도해보십시오

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

응답 해 주셔서 감사합니다! 음, $ keyword를 검사한다면, while 키워드가 천천히 만들어지기 때문에 그 시점까지 전체 구문을 검사하게 될 것입니다 ... 그래서 elseif로하려고하는 것은 " $ token은 "and"가 아니며 "or"가 아니기 때문에 비어 있지 않은 한 $ token에 "and"를 붙여 추가하십시오. ". – Soyo

+0

궁극적 인 목표는 사용자가 "white football helmut"을 입력하면 "white and football and helmut"을 반환한다는 것입니다. 그러나 그들이 "백인과 축구 헬무트"에 들어가면, 이것은 "백인과 축구와 헬무트"가 아닌 "백인과 축구와 헬름"이라는 문구와 함께 사용된다는 것을 인식해야합니다. ... – Soyo

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 ($ 토큰, 배열 ('및', '또는')) {... 으로 바꿀 수 있습니다. – SuitedSloth

+0

좋아요. 원래 질문에 덧붙일 것입니다 ... – Soyo

+0

참고 : 여전히 작동하지 않습니다. 위의 업데이트를 참조하십시오 : – Soyo

관련 문제