[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 メーリングリストの案内