PHP・正規表現の質問です。


「会員IDは345番です」
このような日本語が変数に入っているとします。ここから「番」という特定の文字の前の英数字3文字を抜き出して変数に格納したいです。

文の最初の「会員番号は」のところは可変しますので、最初から6文字目~8文字目を抜き出すというやり方ではダメなのです。

「あなたのIDはa45番ですばい」

このような日本語の場合もあるのです。

これは恐らく正規表現とやらを使うと思うのですが、具体的にどうすればいいのかわかりません。

どなたか教えて頂けるとありがたいです。みなさんよろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2007/04/03 12:43:18
  • 終了:2007/04/10 08:37:13

ベストアンサー

id:nandedarou No.1

nandedarou回答回数230ベストアンサー獲得回数342007/04/03 12:54:27

ポイント50pt

$str = '会員IDは345番です';

$num = preg_replace ('/.*[^0-9]([0-9][0-9][0-9])番.*/', '$1', $str) ;

print_r($num);

でどうでしょうか?

その他の回答(3件)

id:nandedarou No.1

nandedarou回答回数230ベストアンサー獲得回数342007/04/03 12:54:27ここでベストアンサー

ポイント50pt

$str = '会員IDは345番です';

$num = preg_replace ('/.*[^0-9]([0-9][0-9][0-9])番.*/', '$1', $str) ;

print_r($num);

でどうでしょうか?

id:nandedarou No.2

nandedarou回答回数230ベストアンサー獲得回数342007/04/03 13:00:30

ポイント50pt

すみません。訂正します。

$str = 'あなたのIDはa45番ですばい';

$num = preg_replace ('/.*[^a-zA-Z0-9]([a-zA-Z0-9]{3})番.*/', '$1', $str) ;

print_r($num);

id:tokyosmash

おかげさまで出来ました。

nandedarouさんの回答をベースに

(番|ばん)

このようなやり方も覚えました。

いつも具体的で助かります。ありがとうございました。

2007/04/03 13:40:19
id:yuri-jda No.3

yuri-jda回答回数16ベストアンサー獲得回数12007/04/03 13:03:30

ポイント5pt

string.slice(from [, to])

を使うと、string の from~to - 1 文字目(最初の文字を 0 番目とする)の文字列を取得出来るようです。

参考URL:http://www.tohoho-web.com/js/string.htm#slice

substr関数が使えれば一番いいのですが、IE6では未対応の様なので

sliceを使用して①番号までの値を取得し、②番号のみ取り出す

と言う方法はどうでしょうか?

var str = "会員IDは345番です";

str = str.slice(-6);    //「345番です」までを取得

str = str..substring(0, 3);//初めから3文字目までを取得

alert(str); //345がアラートに出力されます


上記を少しシンプルにすると、下記のようになります。

var str = "会員IDは345番です";

str = (str.slice(-6)).substring(0, 3);

alert(str);

id:tokyosmash

これはつまり最初から何番目に出現するか明白な場合でないと使えないですよね?

質問文にも書いてありますが、それは可変なんです。

2007/04/03 13:41:37
id:yuri-jda No.4

yuri-jda回答回数16ベストアンサー獲得回数12007/04/03 13:19:46

ポイント5pt

PHPだったんですね、すみません勘違いしました。。。

消してくださって構いません。

お手数おかけいたしました。

  • id:tokyosmash
    すみません質問文にミスがありました。

    >文の最初の「会員番号は」

    これは

    >文の最初の「会員IDは」

    に訂正します。
  • id:tokyosmash
    追記です。

    「番」という文字が2度出現することは無いです。
  • id:nandedarou
    私の回答の正規表現[^a-zA-Z0-9]が無くてもいいです。(有ってもいいです。)
    $num = preg_replace ('/.*([a-zA-Z0-9]{3})番.*/', '$1', $str) ;

    また、次のようにpreg_matchを使うことも可能です。
    $str = 'あなたのIDはa45番ですばい';
    preg_match('/([a-zA-Z0-9]{3})番/',$str,$matches);
    $num = $matches[1];
    print_r($num);
  • id:nandedarou
    もしも、うまくいかない場合は、以下を読んで下さい。

    「会員IDは345番です」や「あなたのIDはa45番ですばい」の文字コードがPHP内部のエンコードと違う場合は、うまくいかないと思います。

    うまくいかない場合は、preg_replace や preg_match を実行する前に、次のようにして、$strの文字コードをPHP内部のエンコードに変換して見てください。
    $str = mb_convert_encoding( $str, mb_internal_encoding(), mb_detect_encoding($str) );
  • id:tokyosmash
    [^a-zA-Z0-9]は一応あった方が良さそうですよね。
    「Your ID is 745番.」の可能性もありますし。
    まあ有り得ないとは思いますが。

    '$1'
    は何をしているのでしょか。
    リファレンスを見ると
    preg_replace(正規表現,置換文字列,文字列)でした。
    つまり置換文字列って事ですよね。
    うーんよくわかりません。
  • id:nandedarou
    >「Your ID is 745番.」の可能性もありますし。
    最初は、私もそう思ってつけたのですが、

    正規表現の [a-zA-Z0-9]{3}番 は、「番」という文字の直前の前の3つの英数字という意味になります。よって、無くても大丈夫です。

    さらに言えば、「IDは、1234番」の場合でも「234」になります。

    >'$1'は何をしているのでしょか。
    正規表現で丸括弧で囲った部分が
    置換文字列を指定する部分の$1に代入されます。
    もし、()が複数有った場合は、最初の()で囲った部分は$1、次の()で囲った部分は$2、次の()で囲った部分は、$3…となります。
  • id:nandedarou
    [^a-zA-Z0-9]を使う必要があるのは、IDの文字数が決まっていない場合です。その場合次のようにします。
    $num = preg_replace ('/.*[^a-zA-Z0-9]([a-zA-Z0-9]+)番.*/', '$1', $str) ;

  • id:tokyosmash
    なんだかパズルみたいで面白いですね、正規表現って。
    '$1'については理解できました。
    とりあえずこれをベースに少しづつ変えながら覚えていこうと思います。

    いつもわかりやすくて本当に助かってます。
    ありがとうございます。
  • id:kurukuru-neko

    正規表現で置換できない場合の対応を
    していないと予定外の動作をするかも
    しれません。

    3桁以上の桁を許容する場合
    $num = preg_replace ('/^.*[^a-zA-Z0-9]([a-zA-Z0-9]{3,})番.*$/', '$1', $str) ;
    if ($num == $str) {
    print "おかしい\n";
    };

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません