すぐに使えるPHP正規表現のサンプル集

ブログや掲示板のWebアプリにおいて「テキスト中にメールアドレスやURIがある場合は、自動的にアンカーをセットしてほしいなあ」と思うユーザ/デベロッパは多い。一定のパターンがすでにわかっている場合、正規表現による置換が一般的な方法だろう。Build Internet!では、正規表現の基礎と、PHPのpreg_replaceを使ったサンプル集をHow to Automatically Linkify Text with PHP Regular Expressionsとして紹介している。

テキスト中から特定の文字列を抽出し、アンカーを作成するテクニックをここでは「linkify」と呼んでいる。linkify例として、次の3点を挙げている。

  • 本文や投稿されたコメント内にURIがある場合はアンカーをセットする
  • メールアドレスの場合はmailto:をセットし、クリックしてメーラーが起動するように
  • Twitter表記(@reply、ハッシュタグ)にアンカーをセットする

正規表現の基礎

まずは正規表現パターンの書き方についてだ。正規表現ではメタ文字と呼ばれる特別な意味を持つ文字を使ってパターンを記述する。ここではBasic Special Charactersを6点、Common Special Charactersを2点取りあげている。

The Basic Special Characters

  • パイプを使った正規表現 … 複数の文字列をパイプで区切ると、指定した文字列のいずれかにマッチする。"hi|hello"は"hi"と"hello"にマッチする
  • カッコを使った正規表現 … カッコで囲まれた文字列はグループとして扱われる。"br(ily)an"は"brian"と"bryan"にマッチする
  • ブラケットを使った正規表現 … ブラケット内で指定した範囲内の文字にマッチする。"[abc]"は"a","b","c"にはマッチするが、"d"にはマッチしない
  • アスタリスクを使った正規表現 … 直前の表現0個以上にマッチする。"go*gle"は"ggle","gogle","google","gooogle"などにマッチする
  • プラス記号を使った正規表現 … 直前の表現1個以上にマッチする。"go+gle"は"gogle","google","gooogle"などにマッチする
  • クエスチョンを使った正規表現 … 直前の文字0個以上にマッチする。"desktopp?ed"は"desktopped","desktoped"にマッチする

Other Common Special Characters

  • \wは英数字、アンダーバーにマッチする。[a-zA-Z0-9_]と等価
  • \n、\r、\tはそれぞれ改行、キャリッジリターン、タブ文字にマッチする

このほかのリファレンスについては、PHPマニュアルのpreg_replaceにコメントされた内容を参照とのこと。