正規表現を覚えると「.htaccess」ファイルの編集だけでなく、レンタルサーバーを運用していく中で、様々な場面で役に立ちます。
たとえば、
- cronの設定
- シェルスクリプトの作成
- コマンドの実行
- 設定ファイル(xxx.confファイル等)の設定
- プログラムの作成(PHP、Ruby、Python、Perlなど)
などなど、様々な場面で使います。(使えます)
【正規表現】目的別に正規表現をまとめた
正規表現とは何か?
正規表現とは、文字列を操作する様々なパターンを表現する方法です。
例えば、
- ある文字列に特定の文字列が含まれているかを調べる
- ある文字列に特定の文字列が含まれていないことを調べる
など、「パターンマッチング」を実現する方法です。
例えば正規表現を活用することで
- 「1234567890」という文字列があり、その中から「567」という並びがあるかどうか?
- あるWebサイトのページに「割引」という文字列が含まれているか?含まれているとしたら何個含まれているか?
- あるWebサイトのページに「03-xxxx-xxxx」の電話番号と「06-xxxx-xxxx」の電話番号が含まれているか?
などを調べることができます(正規表現で表現することができます)。
正規表現の場合は、説明は簡単にして実際にどのように使うのか?例をたくさん挙げて実際に使ってみるのが一番の早道です。
.htaccess の RewriteEngine の例で解説
実際に「.htaccess」の「RewriteEngine」の例で解説します。
まずは、以下の記事にあるように「http」アクセスを「https」に変換する場合です。
RewriteEngine On RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] |
RewriteRuleの構文ですが、以下のようになっています。
RewriteRule [ここにアクセスしたら] [このようにリライトする] [どんなふうに]
【例】
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
^(.*)$ →すべてのアクセスに対して
https://%{HTTP_HOST}%{REQUEST_URI} →https形式で
[R=301,L] →301リダイレクトする
という意味です。
※すべてのアクセスに対してリライトすると無限ループする可能性があるのでは?と思うかもしれませんが、「RewriteCond」で「HTTPアクセスのみ」と条件指定しているので、「http→https」にリライトされるだけで無限ループは発生しません。
ただし、この「^(.*)$」のように「すべてのアクセスに対して」というような設定は、無限ループを引き起こす原因になるので注意しましょう。
この「^(.*)$」を分析すると
^ → 検索対象の始まり
() → サブパターン
. → 改行を除くすべての1文字にマッチ
* → 0回以上の繰り返し
$ → 検索対象の終わり
です。
つまり、「検索対象の始まりが、改行以外ですべての文字に対して0回以上繰り返している文字列」という意味です。
つまり、「どんな文字列でも」という意味です。
「http」で始まる(RewriteCond %{HTTPS} off)文字列なら、すべて正規表現の対象になる(パターンマッチングしている)ということです。
正規表現のメタ文字まとめ
基本的なメタ文字についてまとめます。
\ (バックスラッシュ/エスケープ/円マーク)
エスケープ文字
数字2桁
\d{2} |
数字3桁-数字4桁(郵便番号)
\d{3}-\d{4} |
^ (カレット/キャレット)
行の始まり
検索対象の始まり
$ (ドル)
行の終わり
検索対処の終わり
. (ドット)
改行を除くすべての1文字にマッチ
最長一致(最長マッチ)で利用できます。
例えば
<div>AAAAAAA</div>BBBBBBBBB<div>CCCCCCCCCC</div>
の場合、「<div>AAAAAAA</div>」だけでなく「<div>AAAAAAA</div>BBBBBBBBB<div>CCCCCCCCCC</div>」まで1行全部を取得できます。
逆に「?」の場合は「最短一致」で取得できます。
[ (ブラケット/左大括弧)
文字クラス定義の開始
連続した小文字のアルファベット1文字
[a-z] |
連続した小文字のアルファベットの繰り返し
[a-z]+ |
] (ブラケット/右大括弧)
文字クラス定義の終了
| (パイプ)
選択枝の開始
( (左小括弧)
サブパターンの開始
) (右小括弧)
サブパターンの終了
? (はてなマーク)
0回か1回マッチ
最短一致(最短マッチ)で利用できます。
例えば
<div>AAAAAAA</div>BBBBBBBBB<div>CCCCCCCCCC</div>
の場合、「AAAAAAA」だけを取得できます。
逆に「.」の場合は「最長一致」で取得できます。
* (アスタリスク)
0回以上の繰り返し
+ (プラス)
1回以上の繰り返し
{ (左中括弧)
最小/最大を指定する量子停止の開始
} (右中括弧)
最小/最大を指定する量子停止の終了
- (ハイフン)
文字の範囲指定
最後に
正規表現は奥が深いです。
しかし正規表現を活用できれば様々な作業が効率化できます。
サーバーを運用していく中でどうしてもトラブルが発生してしまいますが、トラブルシューティングにもなります。
特にインターネットの情報をよく分からずにコピペしてうまく動いていたとしても、何かがキッカケでうまく動かなくなるとどうしていいのか分からずにハマってしまうことがあります。
今後も少しずつこの正規表現のページを更新していこうと思います。
コメント