[PHP-users 30166] Re: 半角文字列、全文字置換したい。
komura
komura @ ma9.seikyou.ne.jp
2006年 8月 28日 (月) 23:06:38 JST
komura です。
桝形さんの補足のようになりますが・・・。
On Mon, 28 Aug 2006 19:15:53 +0900
"KOYAMA Tetsuji" <koyama @ hoge.org> wrote:
> 置き換えも str_replace でできると思うんですが、今試したらどうも
> バグってるくさい。
>
> $from = range('A', 'Z');
> $from[] = 'a';
>
> $to = array_merge(range('0', '9'), range('a', 'z'), range('A', 'Z'));
>
> $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
> $result = str_replace($from, $to, $str);
> var_dump($result);
>
> $from に 'a' を追加しなければ大丈夫ですが、追加すると結果が
> おかしくなります。
>
> 結果:
> // $fom[] = 'a'; なし
> string(26) "0123456789abcdefghijklmnop"
>
> // $fom[] = 'a'; あり
> string(26) "0123456789qbcdefghijklmnop"
問題としては、K -> a -> q と二重に置換えが発生しているという
ことだと思います。
PHP マニュアルの str_replace() の頁を見てみると、以下のように
説明されています。
http://php.net/manual/ja/function.str-replace.php
> search と replace が配列の場合、str_replace() は各配列から
> 値をひとつ取り出し、 subject 上で検索と置換を行うために使用
> します。
それに比べ、strtr() は、以下のように記述されています。
http://php.net/manual/ja/function.strtr.php
> strtr() は、引数を 2 つ指定してコールすることが可能です。
> 引数を 2 つ指定してコールした場合、異なった動作となります。
> 文字列from では、ソース文字列で変換を行う 「文字列 -> 文字列」
> の組を指定する必要があります。 strtr() は、常にまず最も長く
> マッチする文字列を探し、 既に置換されている部分文字列について
> は再度置換を行いません。
str_replace() のマニュアルでは少し分かりにくいような気がしますが、
- str_replace() は再度置換をする
- strtr() は再度置換をしない
ということで、仕様として考えるのが妥当ではないかと思います。
--
komura <komura @ ma9.seikyou.ne.jp>
PHP-users メーリングリストの案内