2017-03-02 6 views
2

나는이 문제를 해결하는 데 아주 가깝지만 문자열을 감싸는 공백을 제거하는 방법을 알 수는 없다. 예 : ' ! ', '! '' !''!'이됩니다. 그리고 이것은? 캐릭터, . 문자 및 기타 구두점 문자.문자열 문자 대체 PHP

여기 내 코드가 있습니다. 그것은 문자를 가져 와서 내가 해낸 나토 단어로 변환해야하는데, 구두점이 잘못되었습니다. 예를 들어 ' ! awesome. .! '' ! Alfa Whiskey Echo Sierra Oscar Mike Echo . . !'으로 바뀌며 구두점 사이의 공백을 원하지 않습니다.

function to_nato($words){ 
    $key = array("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"); 
    $translationKey = array("Alfa", "Bravo", "Charlie", "Delta", "Echo", "Foxtrot", "Golf", "Hotel", "India", "Juliet", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa", "Quebec", "Romeo", "Sierra", "Tango", "Uniform", "Victor", "Whiskey", "Xray", "Yankee", "Zulu"); 
    $strToRet = ""; 
    for($i = 0; $i < strlen($words); $i++) { 
     $letter = substr($words, $i, 1); 
     if(ctype_alpha($letter)) { 
      for($keySearch = 0; $keySearch < count($key); $keySearch++) { 
       $letterToSearch = array_search($key[$keySearch], $key); 
       if(strcasecmp($letter, $key[$letterToSearch]) == 0) { 
        $natoLetter = $translationKey[$letterToSearch]; 
        $strToRet .= $natoLetter; 
       } 
      } 
     } 
     else { 
      $strToRet .= $letter; 
     } 
    } 
    $strToRet = preg_replace('/([a-z])([A-Z])/s','$1 $2', $strToRet); 
    //$strToRet = str_replace(" ! ", "!", $strToRet, $count); 
    return $strToRet; 
} 
+0

문제와 관련하지,하지만 당신은 문자 매핑을 찾기 위해 두 배열 대신에 연관 배열을 사용해야합니다 – Barmar

+0

나는 당신의 기능을 시험해 보았다. 나는 구두점 앞에 여분의 공백이 없다. 구두점 주위의 유일한 공백은 원래 문자열에있는 공백입니다. – Barmar

+0

나는 Alpha Whisky Echo Sierra Oscar Mike Echo를 얻는다. " – Barmar

답변

0

는 원래 문자열에서 구두점 주위의 공간을 제거합니다.
+0

당신의 솔루션 결과는'! AlfaWhiskeyEchoSierraOscarMikeEcho ..!'입니다. 제가 이해하는 것처럼 topicstarter가 원하는 것이 아닙니다 :) – curveball

+0

다음과 같은 테스트 케이스를 전달하고 싶습니다 : 두 문자열이 동일하다는 것을 주장하지 못했습니다. 예상 : '.Yankee' 실제 : '. Yankee ' –

+0

@KaranGoda 올바르게 작동한다는 것을 보여주는 데모를 추가했습니다. 각 음성 문자 사이에는 공백이 있습니다. – Barmar

1

봅니다이 if(ctype_alpha($letter) || $letter==" ")if(ctype_alpha($letter)을 변경합니다. 결과에서 해당 공간을 제거 할 수 있습니다 (설명에서 입력 한 문자열 사용).

$words = preg_replace('/\s*([^\w\s]+)\s*/', '$1', $words); 

DEMO