前提・実現したいこと
大文字->小文字、小文字->大文字に置換したいです。
例
入力 sAfE, waTEr, AAAbbcccDD
理想の出力 SaFe, WAteR, aaaBBCCCdd
自分の失敗出力 SaFe, WAteR, aaabbCCCDD
該当のソースコード
php
1//入力-> sAfE, waTEr, AAAbbcccDD 2$line = explode(", ", trim(fgets(STDIN))); 3 4for($i=0; $i<count($line); $i++){ 5 for($j=0; $j<strlen($line[$i]); $j++){ 6 if(!ctype_upper($line[$i][$j])){ 7 $line[$i] = str_replace($line[$i][$j], strtoupper($line[$i][$j]), $line[$i]); 8 }elseif(ctype_upper($line[$i][$j])){ 9 $line[$i] = str_replace($line[$i][$j], strtolower($line[$i][$j]), $line[$i]); 10 } 11 } 12} 13 14echo implode(", ",$line); 15//SaFe, WAteR, aaabbCCCDD
結果出力 SaFe, WAteR, aaabbCCCDD
期待出力 SaFe, WAteR, aaaBBCCCdd
重複した値が複数ある時の置換を1つずつ行いたいです。
今の自分のやり方は該当文字全て置換しているので、重複文字が奇数の場合は正常に置換されるが、偶数の場合元の文字に戻ってしまいます。
試したこと
調べてみたところ、str_replace
関数では1つずつの置換はできないようです。
preg_replace
関数だと第4引数で1を指定すると、1つずつ置換できるとわかりました。
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] ) : mixed
limit
subject 文字列において、各パターンによる 置換を行う最大回数。デフォルトは -1 (制限無し)。
以下を試してみましたが、正規表現の所に変数を入れることになるからか置換がうまく行きません。
$line[$i] = preg_replace("/($line[$i][$j])/", strtolower($line[$i][$j]), $line[$i],1);
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/19 15:54