2017-03-02 14 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

問題に関連していないが、あなたは文字のマッピングを見つけるために、2つの配列の代わりに連想配列を使用する必要があります。 – Barmar

+0

あなたの機能を試しましたが、句読点の前に余分なスペースがありません。句読点の周りの唯一のスペースは、元の文字列にあったものです。 – Barmar

+0

私は ''!Alfa Whisky Echo Sierra Oscar Mike Echo。! "を返します。 – Barmar

答えて

0

は、元の文字列から句読点の周りのスペースを削除します。
+0

あなたの解決策は '!AlfaWhiskeyEchoSierraOscarMikeEcho ..!'であり、私が理解しているようにトピックスターターが望んでいないものです:) – curveball

+0

私は、このようなテストケースを渡したいと思います:2つの文字列が等しいと主張しません。 期待: '。ヤンキー' 実際: '。 Yankee ' –

+0

@ KaranGoda正しく動作することを示すデモを追加しました。表音文字の間にはスペースがあります。 – Barmar

1

このif(ctype_alpha($letter) || $letter==" ")にこのif(ctype_alpha($letter)を変更するようにしてください。結果のスペースを取り除くことができました(説明で入力した文字列を使用して)。

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

DEMO