質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Q&A

解決済

2回答

1327閲覧

PHP 文字列の置換をしたい。大文字→小文字、小文字->大文字 同じ文字が複数合った場合、1つずつ置換を行いたい

amakuma

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

0グッド

0クリップ

投稿2020/05/19 13:44

編集2020/05/19 13:48

前提・実現したいこと

大文字->小文字、小文字->大文字に置換したいです。
例 
入力 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 (制限無し)。

preg_replace - PHP

以下を試してみましたが、正規表現の所に変数を入れることになるからか置換がうまく行きません。

$line[$i] = preg_replace("/($line[$i][$j])/", strtolower($line[$i][$j]), $line[$i],1);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

無理に文字単位で置き換えなくても、
新しい文字列を作ってから差し替えちゃうという方向性の方が楽だと思います。

PHP

1 2<?php 3 4$input = "sAfE, waTEr, AAAbbcccDD"; 5$lines = explode(", ", trim($input)); 6 7 8foreach($lines as $linesKey => $line){ 9 $newLine = ""; 10 foreach(str_split($line) as $char){ 11 if(ctype_upper($char) === true){ 12 $char = strtolower($char); 13 }else{ 14 $char = strtoupper($char); 15 } 16 $newLine .= $char; 17 } 18 $lines[$linesKey] = $newLine; 19} 20 21var_dump($lines); 22//この後implode(", ",$lines) などで文字列に戻す 23

出力結果

bash

1$ php char.php 2array(3) { 3 [0]=> 4 string(4) "SaFe" 5 [1]=> 6 string(5) "WAteR" 7 [2]=> 8 string(10) "aaaBBCCCdd" 9}

投稿2020/05/19 14:18

編集2020/05/19 14:22
tanat

総合スコア18727

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amakuma

2020/05/19 15:54

とてもわかりやすい書き方で助かりました! 解決いたしました。ありがとうございました!
guest

0

PHP

1$str="sAfE, waTEr, AAAbbcccDD"; 2$pattern="/[a-z]/i"; 3$str=preg_replace_callback($pattern,function($x){ 4 $num=ord($x[0]); 5 return $num>=97?chr($num-32):chr($num+32); 6},$str); 7print $str;

投稿2020/05/19 14:17

yambejp

総合スコア116724

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amakuma

2020/05/19 16:25

回答ありがとうございます 自分の力不足もあり正常に出力することができませんでした。 初めて知った関数もいくつかあるので、ぜひ参考にさせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問