概要
mb_eregは第三引数にarray
を入れた場合は、
一致した部分文字列が格納されます。
ここにarray
以外を入れてみました。
きっかけは
結論
mb_eregの第三引数は配列以外でも動作し、失敗時は引き渡したままの値が残る。
ただし、未定義変数を渡した場合はNULL
に設定される。
これがmb_eregのリファレンスに&
がついていない理由かは不明。
(&
がついているpreg_matchとは失敗時の動作が異なる)
未定義の変数を渡すこと自体は、褒められた書き方ではないと思われるが、
null
に上書きされるため、危険は無いと思われる。
現状存在するコードが意図的に行っているとは言えないのがリスクだが…
mb_ereg 成功パターン
すべてarray
の正常な結果に上書きされる。
コード
// 成功系
$pattern = 'test';
$string = 'test';
test($pattern, $string, array()); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, array('hoge' => 'huga')); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, null); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, 'string'); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, 100); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, true); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, false); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, new stdClass()); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, $regs); // array(1) {[0]=> string(4) "test"}
function test($pattern, $string, $regs) {
mb_ereg($pattern, $string, $regs);
var_dump($regs);
echo "\n\n";
}
mb_ereg 失敗パターン
引数の値が保持される。
ただし、未定義の変数の場合はNULLが定義される。
コード
// 失敗系
$pattern = 'test';
$string = 'bad';
test($pattern, $string, array()); // array(0) {}
test($pattern, $string, array('hoge' => 'huga')); // array(1) {["hoge"] => string(4) "huga"}
test($pattern, $string, null); // NULL
test($pattern, $string, 'string'); // string(6) "string"
test($pattern, $string, 100); // int(100)
test($pattern, $string, true); // bool(true)
test($pattern, $string, false); // bool(false)
test($pattern, $string, new stdClass()); // object(stdClass)#1 (0) {}
test($pattern, $string, $regs); // NULL
var_dump($undefined); // NULL ただし PHP Notice: Undefined variable: undefined
function test($pattern, $string, $regs) {
mb_ereg($pattern, $string, $regs);
var_dump($regs);
echo "\n\n";
}
失敗パターンのつかいどころ?
引数の値が保存されるので、デフォルト値として使える?
成功時は一致結果配列、失敗時はその他の値を返したいとき、
mb_eregの実行結果は不要になる。
$regs = array()
if (mb_ereg($pattern, $string, $regs)) {
return $regs;
} else {
return '失敗しました';
}
$regs = '失敗しました';
mb_ereg($pattern, $string, $regs)
return $regs
失敗時にNULLを返すなら初期化も不要
mb_ereg($pattern, $string, $regs)
return $regs
また、
null[0] // null
(string)null[0] // string(0) ""
で、エラーも出ないので、
mb_ereg($pattern, $string, $regs)
return 'test' . $regs[0]; // もし$patternがあれば追加
とかもできる。
ついでに似たような関数preg_matchではどうなるか調べました。
preg_match 成功パターン
同じくarray
の結果に上書きされる。
コード
// 成功系
$pattern = 'test';
$string = 'test';
test($pattern, $string, array()); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, array('hoge' => 'huga')); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, null); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, 'string'); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, 100); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, true); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, false); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, new stdClass()); // array(1) {[0]=> string(4) "test"}
test($pattern, $string, $regs); // array(1) {[0]=> string(4) "test"}
function test($pattern, $string, $regs) {
preg_match($pattern, $string, $regs);
var_dump($regs);
echo "\n\n";
}
preg_match 失敗パターン
すべて空配列で上書きされる。
コード
// 失敗系
$pattern = '/test/';
$string = 'bad';
test($pattern, $string, array()); // array(0) {}
test($pattern, $string, array('hoge' => 'huga')); // array(0) {}
test($pattern, $string, null); // array(0) {}
test($pattern, $string, 'string'); // array(0) {}
test($pattern, $string, 100); // array(0) {}
test($pattern, $string, true); // array(0) {}
test($pattern, $string, false); // array(0) {}
test($pattern, $string, new stdClass()); // array(0) {}
test($pattern, $string, $regs); // array(0) {}
function test($pattern, $string, $regs) {
preg_match($pattern, $string, $regs);
var_dump($regs);
echo "\n\n";
}
直感ではpreg_matchのほうが普通かなぁ。