• ベストアンサー

eregについて

ereg( "([0-9]{3})-([0-9]{3})-([0-9]{3})", "123-456-789", $regs); として実行すると $regs[0]には123-456-789 $regs[1]には123 $regs[2]には456 $regs[3]には789 ereg( "([0-9]{2})-([0-9]{3})-([0-9]{3})", "123-456-789", $regs); だと $regs[0]には123-456-789 $regs[1]には23   ・・・(1) $regs[2]には456 $regs[3]には789 ereg( "([0-9]{3})-([0-9]{2})-([0-9]{3})", "123-456-789", $regs); だと$regs[0],$regs[1],$regs[2],$regs[3]には何も入らない どうもeregの詳しい動きが分かりません。特に何故(1)は12でなく23になるのか?$regs[0]の値もよく分かりません。最後のパターンも何故$regs[2]に45が入らず$regs[0]~$regs[3]に何も入らないのか?誰か詳しい方解説をお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

>それでは、何故$regs[1]以降に分割して格納されるのでしょう? 正規表現にキャプチャを指示する'(' と ')'を書いているじゃないですか。 このパターンであれば、 ([0-9]{3})-([0-9]{3})-([0-9]{3}) は [0-9]{3}-[0-9]{3}-[0-9]{3} でもよくて、 この場合は$regs[0]に結果だけが格納されます。 ereg http://phpspot.net/php/man/php/function.ereg.html この関数は、pattern で指定した正規表現 により大文字小文字を区別して string を検索します。 pattern の括弧でくくられた部分文字列に マッチし、かつこの関数が 3 番目の引数 regs を 指定してコールされた場合、マッチした部分が配列 regs に格納されます。$regs[1] は最初の左括弧が始まる部分文字列を保持、 $regs[2] は二番目の左括弧が始まる部分文字列を保持、 といったようになっています。$regs[0] は マッチした文字列全体のコピーを保持しています。

shaka001
質問者

お礼

そうだったんですか。あまり意味も分からずに'('と')'を使っていたので、というか意味があるとは知らずに使っていました。 おかげで、eregの動きが大分分かったような気がします。ありがとうございました。

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

>まだ始めたばかりなので単純にeregの詳しい動きを知りたかっただけです すみません、私の言いたいことがうまく伝わらなかったようですね。 eregは使わない方がいい、もしくは使ってはいけない・・・と理解してください なので、他人がeregで書いたものをどうしても読み解く必要がある場合など 特殊な事例以外ではeregの構文を覚える必要はありません (eregという構文があることだけ覚えておき、その表記がでてきたときに マニュアルを読み返せば済む話しなので)

shaka001
質問者

お礼

>eregは使わない方がいい、もしくは使ってはいけない なるほど 多くのサイトではeregよりpreg_matchのほうが速いと書いてありますが、それほどとは知りませんでした。覚えておきます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

eregはpregに劣るらしいのでpregで書きなおすとして たぶんこう言うことがやりたいのでは? <? preg_match( "/([0-9]{2}).*?-([0-9]{3}).*?-([0-9]{3}).*?/", "123-456-789", $regs); print "<pre>"; print_r($regs); ?> こうすれば最初にマッチするのは12ですね 同様に・・・ preg_match( "/([0-9]{3}).*?-([0-9]{2}).*?-([0-9]{3}).*?/", "123-456-789", $regs); とすれば、2番目にヒットするのは45になります

shaka001
質問者

お礼

回答ありがとうございます。 まだ始めたばかりなので単純にeregの詳しい動きを知りたかっただけです。自分としてはperlのs///やtr///のようなものだと思っていたので理解できないでいたのです。 しかし、書いていただいたソースは参考にさせていただきます。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

>$regs[0]には123-456-789 これ、23-456-789 ではないですか? array(4) { [0]=> string(10) "23-456-789" [1]=> string(2) "23" [2]=> string(3) "456" [3]=> string(3) "789" } >特に何故(1)は12でなく23になるのか? 12だと全体がマッチしませんから。 質問にある正規表現を言葉で書いてみると ereg( "([0-9]{2})-([0-9]{3})-([0-9]{3})", "123-456-789", $regs); 二桁の数字がきて次に '-' 、さらに三桁の数字が続き、また'-'がきて そのあとに三桁の数字。 というものですが、123-456-789 を頭から見て 12 ときてもその次は 数字の3ですから、マッチがその時点で失敗します。 2からはじめると、その後ろの3-456-780とマッチするので、最初にあげたような結果になります。 >最後のパターンも何故$regs[2]に45が入らず$regs[0]~$regs[3]に何も入らないのか? そりゃあ、実データのその部分にあるのは '-' にはさまれた 456 ですから、 45 にだけマッチさせても、6の行き場所がありませんから全体のマッチそのものが失敗します。 失敗しているから、$regsの要素全部が空になったという話です。

shaka001
質問者

お礼

>これ、23-456-789 ではないですか? その通りです。間違えました。 全体のマッチですか。それでこのような動きになるわけですね。それでは、何故$regs[1]以降に分割して格納されるのでしょう?分割するのはsplit等の仕事では?

関連するQ&A