delicious! newsing! buzzurlにブックマーク! Yahoo!ブックマーク ライブドア - この記事をクリップ! このエントリーを含むはてなブックマーク

php :: 正規表現 :: 名前つきキャプチャというのを習った

2009/10/18 (Sun) at 1:22 am

エントリのアイコン

たとえばこんな文字列があったとして↓

Reply-To: hiroya Fujii (xxx@example.net)

メールのヘッダですね。この文字列から名前とメールアドレスを抜き出したければこのようにして↓


$str = 'Reply-To: hiroya Fujii (xxx@example.net)';
if(preg_match("/^Reply-To:\s([^()]+)\s\((.+)\)$/", $str, $m)){
  echo $m[1].'さんのメールアドレスは'.$m[2].'です。';
}

てなかんじでやれば、

hiroya Fujiiさんのメールアドレスはxxx@example.netです。

と出力されます。

私はこれが当たり前だと思ってずっとこれをやってたわけですが、な、なんとこういうやり方もあったというのを初めて知ったのでした↓


$str = 'Reply-To: hiroya Fujii (xxx@example.net)';
if(preg_match("/^Reply-To:\s(?<name>[^()]+)\s\((?<email>.+)\)$/", $str, $m)){
  echo $m['name'].'さんのメールアドレスは'.$m['email'].'です。';
}

こちらのほうがわかりやすいですね。$m[1]だったところが$m['name']となっています。パターンのを見るとカッコの中身の書き方が少しちがう。

いちおう基本的な説明をば。

パターンにマッチした部分をあとで参照したいときには、パターンの中で参照したい部分をカッコでくくっておき、preg_match関数でみっつめの引数を指定しておく。上で例だと$mがソレです。あとからそれを$m[0], $m[1], $m[2] .... というかんじで抜き出せる。keyがゼロのところにはマッチした文字列全体、1以降はカッコでくくった文字列が左から順番に入る。

というわけですが、$mのkey値が常に数字になるんで、サンプルのように簡単なものならどうってことないけれども、ものすごく複雑なパターンマッチをやるときには、あとから$m[3]というのがナニを現しているのかがわかりづらいんで、それをわかりよくするために、パターンマッチをした直後に、$name = $m[1]; みたくなかんじでわかりよい変数名に代入し直すというのをいままでやってたわけですが、今回教わったやり方を使えば、つまりカッコでくくったぶぶんの一番最初に

?<bar>

てのを入れてやると、$m['bar']で受け取れるというちょっと便利な機能だったのでした。知らなかったなあ。

オライリーの『詳説 正規表現 3版』を読んで知りました。

これについては、第3章の134ページに載ってますが、本の中では、

PythonとPHPでは「(?P<name>...)」という構文を使うのに対し、.NET言語では「(?<name>...)」という構文を使う。

とあるんだけど、私がやってみたところ、phpでもPナシのヤツでできました。バージョンちがいで仕様が違うのですねたぶん。いやー、これはべんりべんり。

11月12日。あとから追記。

その後、他のサーバでやってみたら、PHP Version 5.0.4だと、本に書いてある通りにPを入れないとだめだとわかりました。PHP Version 5.2.11だと、Pナシでできました。追記以上。

ついでにもうひとつ小ネタを。パターンの中に使うカッコはキャプチャをする以外にその他いくつかの目的がありますよね。選択枝とか、先読み/後読みとか。「キャプチャ以外の目的でカッコを使うとき」言い換えれば「カッコを使うけどキャプチャは不要なとき」には、たとえば、(.+)と書くぶぶんを(?:.+)と書くと、キャプチャ機能はスルーされます。つまりメモリに展開されなくなる。短い処理なら気を遣う必要ないかもしれませんが、長大な文字列を複雑なパターンで整形するようなときには使用メモリがバカにならないので効率の差が出るそうです。これも本に書いてあった。いままであまり気にしていなかったのですが、これからは覚えておこうと思いました。

delicious! newsing! buzzurlにブックマーク! Yahoo!ブックマーク ライブドア - この記事をクリップ! このエントリーを含むはてなブックマーク

add your comment!
2009/10/18, 2:54 AM
コメント アロー! one-px-ffffff-br one-px-ffffff-tr one-px-ffffff-bl one-px-ffffff-br

あ、バックスラッシュのぶぶんが円記号になってしまいました。すません。置き換えて読んでください。このブログはいろいろと問題があるんですが、いまそこらへんをスッキリ解決すべく別サーバに移す作業をしております。それが終わったらへんな表示はなくなると思います。それまでしばらくお待ちを。

one-px-ffffff-tr one-px-ffffff-bl one-px-ffffff-br
add your comment!
2009/10/18, 3:18 AM
コメント アロー! one-px-ffffff-br one-px-ffffff-tr one-px-ffffff-bl one-px-ffffff-br

余談ですが、この本、『詳説 正規表現 第3版』はとてもいいです。第2版からずいぶん間があいての万を辞しての真打ち登場!妥協許すまじ!みたいな、正規表現をしゃぶりつくすような内容で、もう最初の方からすごくって「この本はクルマを運転するための本でなく、クルマを設計したいひと向けの本である」てなことを宣言しています。それだけ奥深く解説してあるのですね。私のような中途半端なレベルの者にはわかんない部分も多いですが、わかるところだけを流し読みしてるだけでも楽しいというかですね、いいですね。第3版の後半は、Perl, Java, .NET, PHPという4言語別に章がわかれて、細かく説明されています。私は Javaと.NETはぜんぜんわからないですが、わからない人にもイメージがつかめるような説明がされていてですね、正規表現の厚みというものがひしひしと伝わるというような感想を持ちました。Javascriptはどうして入れてくれなかったのでしょうか。まぁいいですが。

one-px-ffffff-tr one-px-ffffff-bl one-px-ffffff-br
add your comment!
2009/11/12, 11:41 AM
コメント アロー! one-px-ffffff-br one-px-ffffff-tr one-px-ffffff-bl one-px-ffffff-br

名前つきキャプチャは、過去に書いた長ったらしいパターンをチョイと手直ししたいときにもべんりです。あなたはかつて自分が書いた超ロングなパターンを修正したいとする。途中のどこかにカッコを新たに入れたくなったとする。するとソレ以降のマッチ部分のkey値がひとつづつズレていくじゃないですか。あーここも直さなくちゃ!という連鎖が出てきてキーッとしちゃうわけですが、そういう事態を回避できるなと。覚えておくとべんりかも。

one-px-ffffff-tr one-px-ffffff-bl one-px-ffffff-br

コメント・プリーズ!

お名前 (your name)
(required)
url
(optional) ※公開されます。
メールアドレス (email)
(optional) ※公開されません。管理者にだけわかります。
コメント (comment)
(required)

※クッキーに保存すると次回から入力を省略できるので便利ですが、お使いのコンピュータに情報が残りますので、公共のパソコンなどからアクセスするような場合はチェックをはずしたほうがよいでしょう。

※コメント中のhtmlタグは実体参照に変換されます。たとえば、『<』は『&lt;』というかんじになりますのでhtmlタグをそのまま書き込んでくださってオッケーです。

one-px-ffffff-tl one-px-ffffff-tr one-px-ffffff-bl one-px-ffffff-br
  • php正規表現 名前付キャプチャ - へっぽこ開発室

    とっても不得意な正規表現。 ちと覚えておくと便利な技をメモっておくぞ。 マッチパターンを参照するときは通常 $matches[0],$matches[1],$matches[2]&#8230;などと順番に書いているので どっかでパターンの ...

    2010/2/23, 4:52 PM

PROFILEcaption

藤居ヒロヤ。ウェブデザイナー/ウェブディレクター。ウェブデザインオフィス、3OT NET主宰。名古屋市中区。「優しいデザイン」「激しいデザイン」「正しいデザイン」「セクシーなデザイン」「泣けるデザイン」「もっともなデザイン」... 。あなただけのウェブデザインを丹精込めておつくり致します。見積り依頼等、お気軽にお問い合わせ下さい。

お問い合わせフォーム

RECENT ENTRIEScaption

RECENT COMMENTScaption

TOOLScaption

BOOKMARKScaption

RESOURCEScaption

ARCHIVEcaption