• 締切済み

ereg 処理で行き詰ってます

mb_eregでの処理がどうもうまくいかず、助言していただければ幸いです。 $ageに10代や20代といった変数が入っています。 if(mb_ereg('0代$',$age)){ $age = mb_ereg_replace('0代$',"?",$age); } という感じで語末を1?や2?に変更したいのですが、うまく動いてくれません。 また、eregでの処理なのですが下記のように if(!ereg('[0-9\?]',$FORM[age])){ Error_Msg("入力された年齢の書式が間違っています"); } if(ereg('\?$',$FORM[age])){ $FORM[age] = ereg_replace('\?$',"0代",$FORM[age]); } としているのですが、20代や30代と直接入力した場合でもError処理されず通ってしまいます。 0~9、?以外の文字が入力された場合にError処理させるにはどうすればいいでしょうか?

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

動作した時のテストは以下の様にしました。 $age="20代"; if(mb_ereg('0代$',$age)){ $age = mb_ereg_replace('0代$',"?",$age); } これが、ある環境で動いて、ある環境では動かないということは、 バージョンの違いなのかなとも思いますが、 それより、やはり実データの$ageの中身にゴミが入っていてマッチしないということになっているのではないかと思います。 一度上記のような他に余地のないデータでテストしてみられたらどうでしょうか このテストでダメなら、逆にphpの方に問題があると言えると思います。

noname#56568
質問者

お礼

度々回答ありがとうございます。 単独でテストすると動きますが、組み込んだ状態で動かすと反映されません。 ゴミが入っていない事は確かなのですが、一応正規表現の検索から$をはずしたりしても変わりなく…。 他人が組んだプログラムなので、何が悪戯をしているのか調べるのも一苦労…。 全部組み直す方法を取ろうかと思います。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

if(mb_ereg('0代$',$age)){ $age = mb_ereg_replace('0代$',"?",$age); } は、そのままで、うまく動きました。 $ageは本当に10代や20代の文字列が入っているのでしょうか? また、$FORM[age]と$ageは違うものなのですか? if(!ereg('[0-9\?]',$FORM[age])){ は if(!mb_ereg('^[0-9]\?$',$FORM[age])){ でどうでしょうか?

noname#56568
質問者

お礼

回答ありがとうございます。 うまく動きましたか…。 動作テスト用のローカルサーバーが原因かと思いまして、違うサーバーでも試したのですが、結果は同じでした。(泣) $ageの中に10代~90代までのデータが入っている事は確かです。 実際は配列で読み出しているので$Read[age]になっていますが、特に違いはないと思い$ageに書き換えて投稿しました。 $FORM[age]につきましても配列処理し、そこから読み出して書き換える処理をしています。 入力時の処理についてもmb_eregにしてみましたが…、挙動変わらず…。 何が原因なのかサッパリです。 PHPのVerはローカルが4.3.10、企業が4.2.2です。 もう少し原因を探ってみます。 何かお気づきの点ありましたらお教え下さると助かります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHPの正規表現eregの使い方

    PHP初心者です。 eregを使った入力チェックをしたいのですが、思うように処理できません。 入力は半角英数字のみを受け付け、その他の入力の場合はエラー処理を行いたいと思ってます。 if (!ereg("^[0-9]+$", $user)) { // 半角英数字以外はエラー処理 } 参考のものがあったのでその通りやってみましたが、全角文字も受け付けてしまい困っています。 記号の意味もよくわかりません。 また、これに加え5文字以上8文字以内という条件も付けたいです。 よろしくお願い致します。

    • 締切済み
    • PHP
  • mb_eregについて

    初歩的な質問かもしれませんが、 DB内の1つのカラムに 「a1,a3,a5,a7,a9」という値が格納されてる時、 if(ereg("a9",$str)){ echo "ok"; } という「ereg」を使った条件式でしたら、正常に値が返るのですが、 if(mb_ereg("a9",$str)){ echo "ok"; } と、「mb_ereg」を使用した時には 「Call to undefined function: mb_ereg()」 というエラーが返ってくるのですが これは何が原因なのか、お分かりになる方はいらっしゃいますでしょうか?

    • ベストアンサー
    • PHP
  • 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などの非推奨関数を使用した場合の不具合に関してご教示頂けると幸いです。 宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 配列をmb_ereg_replaceで一気に置き換えるには?

    お世話になります。 mb_ereg_replace関数を使い文字の置き換えを行っているのですが、置き換 えるものが多く、1回で置き換えられないかと思い、質問をさせて頂き ます。 // 検索文配列 $search = array("__tome__", "__hame__", "__hoge__"); // 置き換え文配列 $replace = array("$tome", "$hame", "$__hoge__"); // 置き換え $str = mb_ereg_replace($search, $replace, $str1); とやると Warning: mb_ereg_replace() expects parameter 2 to be string, array given in on line というエラーが出てしまい、うまく置き換える事が出来ません。どのようにすればうまく置き換えられるでしょうか? ご教授のほどよろしくお願いします。

    • ベストアンサー
    • PHP
  • mb_ereg_replaceに関して

    こんにちは。お世話になっております。 開発時(PHP5.1.4)では何ら問題なかったものが、レンタルサーバー上(PHP5.0.4)へアップロードしたら、mb_ereg_replace関数の部分でエラーが出て対処に困っております。 エラー文 Call to undefined function mb_ereg_replace() $key = $_GET['key']; $key = addslashes($key); $key = mb_convert_encoding($key, 'EUC-JP', 'auto'); $key = mb_ereg_replace(" ", " ", $key);//ココでエラー $arr = explode(" ",$key); 上記は実際のソースの一部ですが、GETで渡された文字列(検索キーワード、key=○○)をDB(MySQL)に登録のあるデータを検索する。といった結果を願い設置しております。 借りたサーバ(共有)は、(適切な言葉じゃないかも知れませんが)PHPはCGIのもと動かしているようですが、これも原因の一つなのでしょうか? お忙しいなか恐縮ですが、ご指導のほど宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 例外処理(throws Exception)について

    Javaでインスタンスを作るときの例外処理を学んでいます。 ageクラス(属性は、private int ageのみ)のt1オブジェクトを作るときに、年齢が0歳以上100歳以下ならt1が作られ、それ以外の場合はエラーを返すようにしたいと思いますが、うまくいきません。 そのため、仮に50歳でオブジェクトを作ってから、年齢を150にした場合を考えましたが、Sample クラスのt1.setAge(150);のところで、「処理されない例外の形」というエラーが返っております。 改善点につきまして、ご教示いただければ幸いです。 ■■ageクラス■■ package ex1; public class age { //***属性***// private int age; //***コンストラクタ***// public age(int data){ this.age= data; } //**メソッド**// public int getAge(){ return age; } public void setAge(int age)throws Exception{ //**年齢が0から100までかどうか**/ if((age > 0) && (age <100)){ this.age = age; } else{ throw new Exception("無効です"); } } } ■■Sample クラス■■ package ex1; public class Sample { public static void main(String[] args) { age t1; t1 = new age(50); t1.setAge(150); System.out.println("t1_age="+ t1.getAge()); } }

  • mb_ereg_replaceについて

    マルチバイトでの置き換えについて質問です。現在は以下のように str_replaceで置き換えしており文字化けはないのですがマルチバイト 対応のmb_ereg_replaceで実行したほうがいい事を知りました。 以下現在のソースです。 // 検索文配列 $search = array("{#aaa#}", "{#bbb#}", "{#ccc#}"); // 置き換え文配列 $replace = array("あああ", "いいい", "ううう"); // 置き換え $str = str_replace($search, $replace, $str); 単純にstr_replaceをmb_ereg_replaceにしてみたのですがエラーに なってしまいました。 置き換えしたい文字が複数あるのでできれば検索文字、置き換え文字を 配列として使用したいのですがどうすればいいのでしょうか? ちなみにですが文字コードはutf-8です。

    • ベストアンサー
    • PHP
  • 【PHP】ereg() で文字種判定するときエラーになる

    PHP5使用者です。 ereg() でよくわからないエラーに直面して悩んでおります。 例えば、サンプル文字列が半角数字a~z又は -(ハイフン)のみで構成されているか調べたい場合、以下の方法を試しました。 1)if( ereg("^[\-a-z]+$", $str )){ 2)if( ereg("^[a-z-]+$", $str )){ 3)if( mb_ereg("^[\-a-z]+$", $str )){ 4)if( preg_match("/^[\-a-z]+$/", $str )){ 但し $str はシングルバイト文字です 結果、1)のみエラーになります。-をエスケープしているのになぜでしょうか? 文字コードはShift_JIS、EUC-JP、UTF-8とも試しましたが同じでした。そもそも常にマルチバイト関数を使うべきとか…? 解説していただける方、よろしくお願いいたします。

    • 締切済み
    • PHP
  • mb_ereg_replace での文字変換

    PHPでフリーの掲示板を制作中です。 目立たせようとする記号を削除しましたがうまく動きません。 $html = mb_ereg_replace('△', '', 'あああ△あああ'); ・希望結果 ああああああ ・実際の結果 ああ 文字コードは全て EUC-JP です。 また以下を追加するとエラーがでました。 $str="あああ△あああ"; $str = mb_convert_encoding($str, 'EUC-JP', 'auto'); ・エラー Warning: mb_convert_encoding() [function.mb-convert-encoding]: Unable to detect character encoding in そもそもmb_convert_encodingを使わない方が良いのか使い方が悪いのかも解りませんがアドバイスお願いします。

    • ベストアンサー
    • PHP
  • swich文を使ったメールフォームの作成について。

    <?php // Error indicate. $error_msg = '未入力...'; /*--- Form mode ---*/ $mode = isset($_POST["mode"]) ? htmlspecialchars($_POST["mode"]) : "input"; /*--- 入力項目 ---*/ $mail = (isset($_POST["mail"]) && $_POST["mail"]!=$error_msg) ? htmlspecialchars($_POST["mail"]) : ""; switch ($mode) { /*--- 入力画面 ---*/ case 'input': echo' <html> <body> <form enctype="multipart/form-data" action="inquiry.php" method="post"> <input type="hidden" name="mode" value="check" /> <div>* メールアドレス<input name="mail" type="text" value="'.$mail.'" size="" /></div> <div><input type="submit" value="確認する" /></div> </form> </body> </html> '; break; /*--- 入力チェック画面 ---*/ case 'check': //----------------------------------------- // 入力チェック。 //----------------------------------------- //User Mail. if ($mail == "") {//未入力処理。 $mail ='<font color="red">'.$error_msg.'</font>'; $error = 1; } else if ( ereg("^[^@]+@[^.]+\..+", $mail) == false ){//書式処理。 $mail ='メールアドレスの書式が正しくありません。'; $error = 1; } else { $mail = $_POST["mail"]; } if ($mail != "") {// 全角を半角に。 $mail = mb_convert_kana($_POST["mail"], "a", "utf-8"); } echo' <html> <body> <h1>ご入力内容をご確認してください。</h1> <div>* メールアドレス<br />'.$mail.'</div> '; /*--- 未入力画面 ---*/ if($error == 1) { echo' <div> <form action="inquiry.php" method="post"> <input type="hidden" name="mode" value="input" /> <input type="hidden" name="mail" value="'.$mail.'" /> <input type="submit" value="戻る" /> </form> </div> </body> </html> '; } /*--- 送信可能画面 ---*/ if($error == 0) { echo' <form action="inquiry.php" method="post"> <input type="hidden" name="mode" value="send" /> <input type="hidden" name="mail" value="'.$mail.'" /> <input type="submit" value="送信" /> </form> <form action="inquiry.php" method="post"> <input type="hidden" name="mail" value="'.$mail.'" /> <input type="submit" value="戻る"> </form> </body> </html> '; } /*--- 送信画面 --*/ case 'send': } /* swich文を中心にメールフォームを作っています。 入力画面で「$mail」には、入力内容、未入力の場合、エラー文が代入されます。 再び、入力画面に戻ると、当然ですが、入力欄には、エラー文が表示されてしまいます。 $mailを空にして入力画面に戻せば良いのですが、正しい入力や多少のミス入力した場合等、 ユーザが入力した値を、入力欄に戻したいと思っています。 どのような処理をすれば良いのでしょうか? 皆様、ご回答の方、どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP