php5.3.3でeregをループ内で使用すると
php5.3.3でeregをループ内で使用すると動作がとまり、エラーログにも何も出力されません。
10回目のループでなぜか動作がとまるようです。
$mail="";
$fp=fopen("php://stdin", "r");
while(!feof($fp))
$mail.=fread($fp, 10240);
fclose($fp);
$MailArray = explode("\n", $mail);
$Counter = 0;
$InputCheck = new InputCheck();
for ($i = 0; $i < count($MailArray); $i++){
if (strpos($MailArray[$i], "From: ") === 0){
$From = str_replace("From: ", "", $MailArray[$i]);
$From = ereg_replace(">.*$", "", $From);
$From = ereg_replace("^.*<", "", $From);
$From = ereg_replace("\r", NULL, $From);
if(!$InputCheck->isRightEMail($From)){
$i++;
$From = str_replace("From: ", "", $MailArray[$i]);
$From = ereg_replace(">.*$", "", $From);
$From = ereg_replace("^.*<", "", $From);
$From = ereg_replace("\r", NULL, $From);
}
}
else if (strpos($MailArray[$i], "To: ") === 0){
$To = str_replace("To: ", "", $MailArray[$i]);
$To = ereg_replace(">.*$", "", $To);
$To = ereg_replace("^.*<", "", $To);
$To = ereg_replace("\r", NULL, $To);
if(!$InputCheck->isRightEMail($To)){
$i++;
$To = str_replace("To: ", "", $MailArray[$i]);
$To = ereg_replace(">.*$", "", $To);
$To = ereg_replace("^.*<", "", $To);
$To = ereg_replace("\r", NULL, $To);
}
}
}
上記は空メールされたfromとtoを取得するものです。
eregをpregに変えれば問題なく動作します。
5.3以降からeregは非推奨になりましたが、使用することはできるようですが、ループ内で使用するとなぜか動作がそこでストップします。
非推奨の関数を使用すると動作が止まりエラーログにも出力されないことはよくあるのでしょうか?
エラーログに出力されなかったため原因を特定するのに苦労しました。
eregなどの非推奨関数を使用した場合の不具合に関してご教示頂けると幸いです。
宜しくお願いいたします。
お礼
なるほど!これは知りませんでした。レンタルサーバがPHP5になったので早速使ってみます。 >>ereg_replace()は使う確固たる根拠がない限り使わないほうが良い preg_replace() はマルチバイトに弱いというイメージを持ってまして、例えば、 ・UTF-8しか使えない ・正規表現がうまく動かない?つまり、 $newStr = preg_replace("/第.章/", "第四章", "それは第□章です。"); では置換されない。(.が3つなら置換されるけれど) などの理由によりpreg_replace()は極力避けていたのですが… どうなんでしょうか。