REDLINE MAGAZINE | 正規表現 勉強メモREDLINE MAGAZINEトップページへ

すべてのエントリを見る

正規表現 勉強メモ

まずはこちらのページをもっかい読み直した。一応人間なのでここに書いてある事は理解できました。ていうか、初めて正規表現に触る人間にはめっちゃ分かりやすいと思います。

サルにもわかる正規表現入門

メタ文字

メタ文字 意味
\ 多目的に使う一般的なエスケープ文字
^ 検索対象の文字列の始まり
$ 検索対象の文字列の終わり
. 任意の1文字(改行を除く)
[ 文字クラスの始まり
] 文字クラスの終わり
| 選択 いずれかの文字列
( サブパターン(グループ化)の開始
) サブパターン(グループ化)の終了
? 0または1 回マッチ(直前の文字がまったくないか、1つだけある)
* 0回以上の繰り返し(直前の文字がないか、1個以上連続する)
+ 1回以上の繰り返し(最低でも1個は + の直前の文字が必要)
{ 最小/最大を指定する量指定子の開始(繰り返しの数)
} 量指定子の終了

文字クラスので使えるメタ文字

メタ文字 意味
\ 一般的なエスケープ文字
^ クラスの否定
ただし、文字クラスの最初の文字に用いた場合のみ
- 文字の範囲の指定
] 文字クラスの終了

いざ、解読してみる

正規表現でURLが正しい形かどうかを調べるパターンを知りたかったので「PHP 正規表現 url」でググったらこちらのページが出てきたので、これを頑張って解読する。

正規表現:正しいURLかどうか調べる - phpspot

/^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/

最初と最後の「/」
デリミタ。
「^」
文字列の先頭
「(https?|ftp)」
最初と最後の( )はサブパターン(グループ)
「?」は直前の要素が0個(空)か1個、「|」はどちらかにマッチ。
つまり「httpかhttpsかftpのいずれかから始まる文字列にマッチ」
「:\/\/」
http://の「://」の部分。\はエスケープ。(デリミタとかぶってるからかな)
「[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]」
[ ]は文字クラス。この[ ]の中のいずれかにマッチする。
文字クラスの中の「-」は範囲。但し、「-」が先頭や末尾で使われた場合は文字として扱う。
「a-z」「A-Z」「0-9」は小文字のaからz、大文字のAからZ、数字の0から9のどれか。
「-」「_」「.」「!」「~」「*」「\」「'」「(」「)」「a-z」「A-Z」「0-9」「;」「\」「/」「?」「:」「@」「&」「=」「+」「$」「,」「%」「#」のいずれかを含む文字。
「+」
1以上繰り返し
「$」
文字列の最後

ということで、この意味は『「http」か「https」か「ftp」のいずれかから始まって、「://」が続いてその後「-」「_」「.」「!」「~」「*」「\」「'」「(」「)」「a-z」「A-Z」「0-9」「;」「\」「/」「?」「:」「@」「&」「=」「+」「$」「,」「%」「#」のいずれかの文字が1回以上続く』パターンにマッチするもの、という意味になる。

文字クラスの中の記号については多分これ。RFC 3986で決まってるやつ。

>>Uniform Resource Identifier (URI): Generic Syntax
>>Uniform Resource Identifier (URI): 一般的構文

これ、解読した後、こんなページも見つけてだな・・・。

【PHP 4.3.9 正規表現】 正規表現、やっぱり苦手です。 得意な方お願いします。 URLが正しいかどうかチェック if (preg_match('/^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;.. - 人力検索はてな

ほんとだ。確かにhttp://wwwでも通ってるし。まぁいいや。

PHPの正規表現関連の関数

PHPの正規表現の関数にはereg系の関数と、Perl互換のpreg系の関数がある。マニュアルによると、Perl互換の正規表現構文を使用するpreg_match()の方が、多くの場合ereg()よりも速く動作するとのこと。

ereg系(POSIX正規表現関数)

PHP: POSIX 正規表現関数 - Manual

ereg 正規表現によるマッチングを行う
eregi 大文字小文字を区別せずに正規表現によるマッチングを行う
ereg_replace 正規表現による置換を行う
eregi_replace 大文字小文字を区別せずに正規表現による置換を行う
split 正規表現により文字列を分割し、配列に格納する
spliti 大文字小文字を区別しない正規表現により文字列を分割し、配列に格納する
sql_regcase 大文字小文字を区別しないマッチングのための正規表現を作成する
  • バイナリセーフではない。
  • ・・・その他の事マニュアル読んでもよくわかんない。あんまり使わない方がいいみたいな雰囲気を感じた。

preg系(Perl互換の正規表現関数)

PHP: PCRE 関数 - Manual

preg_match 正規表現によるマッチングを行う
preg_match_all 繰り返し正規表現検索を行う
preg_replace 正規表現検索および置換を行う
preg_split 正規表現で文字列を分割する
preg_grep パターンにマッチする配列の要素を返す
preg_last_error 直近の PCRE 正規表現処理のエラーコードを返す
preg_quote 正規表現文字をクオートする
preg_replace_callback 正規表現検索を行い、コールバック関数を使用して置換を行う
  • PCREっていうのは汎用の正規表現ライブラリのこと。
  • バイナリセーフ
  • スラッシュ (/) などのデリミタで囲う必要がある。
  • デリミタとしては、英数字およびバックスラッシュ(\) 以外のすべての文字を使用可能。
  • デリミタ文字を正規表現本体において使用する必要がある場合は、 バックスラッシュでエスケープする。
  • PHP 4.0.4 以降、 Perl形式の (), {}, [], <> も使用可能。
  • パターン修飾子が使える。

参考サイト

真面目に勉強し始めて思ったけど、正規表現ってパズルみたい。レイトン教授もこういう問題出せばいいのに。なんだか正規表現ってすごく面白いものだったんだなぁ、と思いました。ネットの情報で済まそうと思ってたけど、本買ってくる。

<< PHP ユーザー定義関数 | PHP ヒアドキュメント >>

トラックバック

このエントリーのトラックバックURL:
http://redline.hippy.jp/cgi/mt/mt-tb.cgi/219

このページの一番上へ

その他の情報など

最近のコメント

PHP オブジェクト指向の勉強
  • Red - 2010.01.08
  • hogepage - 2010.01.21
  • Red - 2010.01.22
  • - 2011.11.27
  • houseiii - 2011.11.27
Fireworks トリミング画像を一括書出 CS4編
  • Iper - 2009.06.27
  • Red - 2009.06.27
  • mala - 2011.11.17
  • Red - 2011.11.18
jQueryでボックスを上下左右中央に簡単配置
overflow を使用したボックス背景のこと
  • - 2007.12.13
  • Red - 2007.12.13
  • - 2007.12.13
  • Red - 2007.12.13
  • hj - 2011.09.23
IE6 → 透過PNG+overflow=混ぜるな危険(追記有)

メッセージを送る

こちらのメッセージ送信フォームは閉鎖させて頂きました。
御用の方は新しい方のブログ にコメント頂くか、 連絡用のフォーム もありますので、そちらからご連絡ください。