読者です 読者をやめる 読者になる 読者になる

PHP strtr()のバグ?仕様?

sample.phpの内容

<?php
$str = "Hello world!\n";

echo strtr($str, "Hello ", "");
echo strtr($str, array("Hello " => ""));
?>

2つの出力が同じ"world\n"であることを期待したのだが実際は異なる。

$ php sample.php
Hello world!
world!
$ php -v
PHP 4.4.8 (cli) (built: Feb 27 2008 11:21:28)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies
$

PHP 5.2.6でも同じ。

$ php sample.php
Hello world!
world!
$ php -v
PHP 5.2.6 (cli) (built: May 22 2008 17:26:15)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies

strtr() を見ると、

説明
string strtr ( string $str , string $from , string $to )
string strtr ( string $str , array $replace_pairs )

この関数は str を走査し、 from に含まれる文字が見つかると、そのすべてを to の中で対応する文字に置き換え、 その結果を返します。

from と to の長さが異なる場合、長い方の余分な文字は無視されます。

とある。単に、fromの文字を見つけてtoに変換すると思っていたが、

from と to の長さが異なる場合、長い方の余分な文字は無視されます。

とあり、長い方の余分な文字、"Hello " - "" つまり、"Hello "は無視されるのではないだろうかと思うと、仕様なのかもしれないが、なんとも。。。。