PHP 正規表現の入門

WBOY
WBOYオリジナル
2016-06-23 14:30:41913ブラウズ

[ 注: 印刷版 Smashing Book #3 をすでに予約注文しましたか?この本は、Web サイトを再設計する方法に関する専門的なガイドであり、専門家によって書かれた、進歩的な Web デザインのためのまったく新しい考え方も紹介しています。]

1. 正規表現とは

正規表現 (正規表現または正規表現とも呼ばれます) の主な目的regexp は、指定されたテキスト内のパターンを効率的に検索することです。これらの検索パターンは、正規表現パーサーが理解できる特別な形式を使用して記述されます。

正規表現は Unix システムに由来しており、ユーザーが文字列を操作したりテキストを操作したりするのに役立つ grep と呼ばれるプログラムが設計されました。 いくつかの基本的なルールに従うことで、非常に複雑な検索パターンを作成できます。

例として、電子メールまたは電話番号の形式が正しいかどうかを確認するタスクが与えられたとします。正規表現のおかげで、いくつかの簡単なコマンドを使用することで、これらの問題を簡単に解決できます。構文は最初は必ずしも簡単そうに見えませんが、一度学習すると、数文字を入力するだけでかなり複雑な検索を簡単に実行できることがわかり、別の観点から問題にアプローチできるようになります。

2 Perl 互換の正規表現

PHP は、さまざまな解析エンジンを使用するかなりの数の正規表現関数を実装しています。 PHP には 2 つの主要なパーサーがあります。 1 つは POSIX と呼ばれ、もう 1 つは PCRE または Perl 互換正規表現です。

POSIX の PHP 関数プレフィックスは ereg_ です。 PHP 5.3 のリリース以降、このエンジンは非推奨になりましたが、より最適で高速な PCRE エンジンを見てみましょう。

PHP では、すべての PCRE 関数は preg_match や preg_replace などの preg_ で始まります。完全な関数リストは PHP のドキュメントで読むことができます。

3. 基本構文

正規表現を使用するには、まず構文を学ぶ必要があります。この構文は、一連の文字、数字、ドット、ハイフン、特殊記号で構成されており、さまざまな括弧を使用してグループ化できます。

PHP では、すべての正規表現パターンは Perl 形式を使用した文字列として定義されます。 Perl では、正規表現パターンは /hello/ のようにスラッシュの間に記述されます。 PHP では、これは文字列「/hello/」になります。

それでは、正規表現の基本的な構成要素である演算子をいくつか見てみましょう

演算子の説明
^ サーカムフレックス記号は始まりを示しますパターンの一部ですが、省略できる場合もあります
$ サーカムフレックス記号と同様に、ドル記号は検索パターンの終わりを示します
ピリオドは任意の 1 文字と一致します
? 前のパターンと 0 回または 1 回一致します
+ 前のパターンと 1 回以上一致します
* 前のパターンと 0 回以上一致します
| Boolean OR
- 要素の範囲に一致します
() 異なるパターン要素をグループ化します
[] 四角形の間の任意の 1 文字と一致します括弧
{min, max} 正確な文字数を照合するために使用されます
d 任意の 1 桁の数字と一致します
D 任意の 1 つの数字以外の文字と一致します
w アンダースコア (_) を含む任意の英数字と一致します
W アンダースコア文字を除く任意の非英数字と一致します
s 空白文字と一致します

PHP では、スラッシュ文字は単純なスラッシュを使用してエスケープされます。例: '/he/llo/'

これらの演算子の使用方法を簡単に理解するために、いくつかの例を見てみましょう:

例の説明 のいずれかに一致します'/abc{1}/'その後の 1 つの c 文字と正確に一致します文字ab。例えば。 abc には一致しますが、abcc には一致しません‘/abc{1,}/’文字 ab の後の 1 つ以上の c 文字と一致します。例えば。 abcor abcc‘/abc{2,4}/’文字 ab の後の 2 ~ 4 個の c 文字と一致します。例えば。 abc、abccc、abcccc には一致しますが、abc には一致しません

演算子のほかに、検索パターンの動作をグローバルに変更できる正規表現修飾子があります。

正規表現修飾子は、「/hello/i」のようにパターンの後に配置され、マークを付ける i などの 1 つの文字で構成されます。大文字と小文字を区別しないパターン、または空白文字を無視する x 。修飾子の完全なリストについては、PHP のオンライン ドキュメントを参照してください。

正規表現の本当の力は、これらの演算子と修飾子の組み合わせに依存しているため、かなり複雑な検索パターンが作成されます。

4. PHP で正規表現を使用する

PHP には、合計 9 つの PCRE 関数を使用できます。リストは次のとおりです:

preg_filter?正規表現検索を実行し、preg_grep を置き換えますか?パターン preg_last_error に一致する配列エントリを返します?最後の PCRE 正規表現実行のエラー コードを返します preg_match ?正規表現一致 preg_match_all を実行しますか?グローバル正規表現一致 preg_quote を実行しますか?正規表現文字を引用符で囲みます。 preg_replace ?正規表現検索を実行して preg_replace_callback を置き換えますか?コールバック preg_split を使用して正規表現検索と置換を実行しますか?正規表現による文字列の分割

最も一般的に使用される 2 つの関数は、preg_match と preg_replace です。

正規表現検索を実行するテスト文字列を作成することから始めましょう。古典的な Hello World で行うべきです。

クリップボードにコピーして印刷するか?

$test_string = 'hello world';  

単純に「hello」または「world」という単語を検索したい場合、検索パターンは次のようになります:

view plain copy to Clipboard print ?

preg_match('/hello/', $test_string);   preg_match('/world/', $test_string);  

文字列が hello という単語で始まるかどうかを確認したい場合は、次のように検索パターンの先頭に ^ 文字を置くだけです:

view plain copy to Clipboard print ?

preg_match('/^hello/', $test_string);  

正規表現では大文字と小文字が区別され、上記のパターンは単語 hElLo と一致しないことに注意してください。パターンの大文字と小文字を区別しないようにするには、次の修飾子を適用する必要があります:

view plain copy to Clipboard print ?

preg_match('/^hello/i', $test_string);  

パターンの最後にあるスラッシュの後の文字 i に注目してください。

次に、より複雑な検索パターンを調べてみましょう。文字列の最初の 5 文字が英数字であることを確認したい場合はどうすればよいでしょうか。

view plain copy to Clipboard print?

preg_match('/^[A-Za-z0-9]{5}/', $test_string);  

この検索パターンを詳しく見てみましょう。まず、キャレット文字 (^) を使用して、文字列が英数字で始まる必要があることを指定します。これは [A-Za-z0-9] で指定されます。

A-Z は、A から Z までのすべての文字とそれに続く a-z を意味します。これは小文字を除いて同じです。正規表現では大文字と小文字が区別されるため、これは重要です。 0-9 が何を意味するかはご自身で理解できると思います。

{5} は、正規表現パーサーに正確に 5 文字をカウントするように指示するだけです。 5 の代わりに 6 を指定すると、パーサーは何も一致しません。テスト文字列では、hello という単語の長さが 5 文字で、その後に空白文字が続きますが、この場合は空白文字はカウントされません。

また、これは正規表現は次の形式に最適化できます:

view plain copy to Clipboard print ?

preg_match('/^w{5}/', $test_string);  

w は、任意の英数字とアンダースコア文字 (_) を指定します。

6. 便利な正規表現関数

ここでは、日常的に使用できる正規表現を使用した PHP 関数をいくつか紹介します。

電子メールを検証します。この関数は、指定された電子メール アドレス文字列が正しい形式であるかどうかを検証します。

クリップボードにプレーン コピーを表示 印刷 ?

function validate_email($email_address) { if( !preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0] -9_-])+ ([a-zA-Z0-9._-]+)+$/", $email_address)) { return false;       } trueを返します。   }

URL を検証します

クリップボードにプレーンコピーを表示します 印刷しますか?

function validate_url($url) { return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0- 9]+)? (/.*)?$|i', $url);   }

繰り返される単語を削除します。テキスト内で「this this」などの単語が繰り返し使われていることがよくありました。この便利な機能は、そのような重複した単語を削除します。

function remove_duplicate_word($text) { return preg_replace("/s(w+s)1/i", "$1", $text);   }

英数字、ダッシュ、アンダースコア、スペースを検証します

クリップボードへのプレーンコピーを表示します 印刷しますか?

function validate_alpha($text) { return preg_match("/^[A-Za-z0-9_-]+$/", $text);   }

米国の郵便番号を検証する

クリップボードにコピーしたものを表示して印刷しますか?

function validate_zip($zip_code) { return preg_match("/^([0-9]{5})(-[0-9]{4})?$/i",$zip_code);   }

7. Regex Cheat Sheet

最近の Cheat Sheet はクールなので、何かを忘れたときにいつでもすぐに実行できる PCRE Cheat Sheet を以下に見つけることができます。

メタ文字 説明

'/hello/' word hello
'/^hello/' 文字列の先頭にある hello と一致します。一致する可能性があるのは、hello または helloworld ですが、worldhello
'/hello$/' 文字列の末尾の hello と一致します。
'/he.o/' 任意の文字と一致します。彼とoの間。一致する可能性があるのは helo または heyo ですが、 hello
‘/he?llo/’ llo または hello
‘/hello+/’ hello on または more time には一致します。例えば。 hello or hellohello
'/he*llo/' llo、hello または hehello には一致しますが、hellooo
'/hello|world/' 単語 hello または world
'/(A-Z)/' ハイフン文字と一緒に使用すると、このパターンは A から Z までのすべての大文字に一致します。 A、B、C…
'/[abc]/' 任意の 1 文字、a、b、c と一致します
^ の開始をマークします。文字列文字列の終わりをマークします任意の 1 文字と一致しますBoolean ORグループ要素範囲内の項目 (a、b、または c)範囲外 (a、b、または c を除くすべての文字)空白文字0 個または 1 個の b 文字。 a{0,1} と等しい a 1 つ以上の aa{2} a のうちの 2 つa{,5}a の 5 つまでa{5,10} a の 5 から 10 までw任意の英数字とアンダースコア。 [A-Za-z0-9_] に相当しますW英数字以外の任意の文字s任意の空白文字S白以外の任意の-スペース文字d任意の数字。 [0-9] に相当しますD数字以外の任意の値。 [^0-9] に等しい
$
.
|
()
[ abc]
[^abc]
s
a?
a*
a+
パターン修飾子 説明
i大文字と小文字を区別しないm複数行モードS パターンの追加分析uパターンは UTF-8 として扱われますJoel Reyes 数年間 Web サイトのデザインとコーディングを行っていますこれにより、彼は Web デザインとグラフィック デザインを中心としたデザイン リソースとポートフォリオ サイトである Looney Designer のクリエイティブな頭脳を担うようになりました。 .html
8. 役に立つ書籍 15 Web 開発者のための PHP 正規表現 PHP で正規表現をマスターする PHP Regex の概要 著者: Joel Reyes

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。