この記事は、PHP 面接での正規表現に関する知識をまとめた (超詳細な) ものです。一定の参考価値があります。困っている友人は参考にしてください。お役に立てれば幸いです。
関連おすすめ: 「2019 PHP 面接質問まとめ (集)」
1. はじめに
#1. 正規表現とは
正規表現 (正規表現) は、特定のパターンを使用して文字列の種類と一致する式です。正規表現は、単一の文字列を使用して、特定の構文規則に一致する一連の文字列を記述および照合します。
正規表現は面倒ですが強力です。学習後、適用すると効率が向上するだけでなく、絶対的な達成感を得ることができます。このチュートリアルを注意深く読み、適用する際に特定の参照を作成する限り、正規表現を習得するのは問題ありません。
多くのプログラミング言語は、正規表現を使用した文字列操作をサポートしています。
2. 正規表現の役割
文字列の分割、検索、一致、置換3. PHP 式の正規表現
PHP には 2 つの正規表現関数ライブラリのセットがあります。2 つの関数は似ていますが、実行効率がわずかに異なります。 1 つのセットは PCRE ( Perl 互換の正規表現 ) ライブラリによって提供されます。プレフィックス「preg_」の付いた名前の関数;POSIX (Unix のポータブル オペレーティング システム インターフェイス) 拡張機能によって提供されるセット。プレフィックス「ereg_」が付いた名前の関数を使用してください。
PCRE 構文は、POSIX 構文よりも多くの機能をサポートし、強力です。したがって、この記事では、
PCRE 構文
4 の正規表現を中心に紹介します。 正規表現の構成
PHP では、正規表現を分割します。区切り文字、式、パターン修飾子の 3 つの部分に分かれています。区切り文字
区切り文字には、文字、数字、バックスラッシュ (\)、空白文字を除く任意の ASCII 文字を使用できます。最も一般的に使用される区切り文字は、スラッシュ (/)、ハッシュ記号 (#)、および否定記号 (~) です。
式
は、いくつかの特殊文字と特殊でない文字列で構成されています。正規表現の一致ルールを決定する主要な部分です。2. デリミタ
1. デリミタの選択
PCRE 関数を使用する場合、正規表現を囲む必要があります区切り文字によって。 区切り文字には、文字、数字、バックスラッシュ (
\)、および空白文字を除く任意の ASCII 文字を使用できます。
最も一般的に使用される区切り文字は、スラッシュ (/)、ハッシュ記号 (
#)、および否定記号 (
~) です。
/foo bar/ (合法) #^[^0-9]$# (合法) +php+ (合法) %[a-zA-Z0-9_-]% (合法)
#[a-zA-Z0-9_-]/ (非法,两边的分隔符不同) a[a-zA-Z0-9_-]a (非法,分隔符不能是字母) \[a-zA-Z0-9_-]\ (非法,分隔符不能是反斜线(`\`))
上記の区切り文字に加えて、括弧スタイルの区切り文字も使用できます。左括弧と右括弧は、それぞれ開始区切り文字と終了区切り文字として機能します。
{this is a pattern}2. 区切り文字の使用
正規表現で区切り文字を使用する場合は、バックスラッシュ (\) エスケープを使用する必要があります。
正規表現内で区切り文字が頻繁に使用される場合は、読みやすさを向上させるために他の区切り文字を使用することをお勧めします。
/http:\/\// #http://#
文字列を正規表現に入れる必要がある場合は、preg_quote() 関数を使用して文字列をエスケープできます。 2 番目のパラメータ (オプション) を使用して、エスケープする必要がある区切り文字を指定できます。
//在这个例子中,preg_quote($word) 用于保持星号和正斜杠(/)原文涵义,使其不使用正则表达式中的特殊语义。 $textBody = "This book is */very/* difficult to find."; $word = "*/very/*"; $reg = "/" . preg_quote($word, '/') . "/"; echo $reg; // 输出 '/\*\/very\/\*/' echo preg_replace ($reg, "<i>" . $word . "</i>", $textBody); // 输出 'This book is <i>*/very/*</i> difficult to find.'
終了区切り文字の後にパターン修飾子を追加して、マッチング効果に影響を与えることができます。
次の例は、大文字と小文字を区別しない一致です#[a-z]#i
3. メタ文字
1. エスケープ文字説明 | |
---|---|
たとえば、「n」は文字「n」と一致します。 「n」は改行文字に一致します。シーケンス '\' は "" に一致し、"(" は "(" に一致します。 |
# 入力文字列の先頭 (または複数の文字列の先頭) と一致します。 -line モード、これは行の先頭です) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
は入力文字列 (または複数行) の末尾と一致しますモード、行末です ) |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
単語の境界、つまり単語と単語の間の位置と一致します。スペース |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
非単語境界のマッチング |
文字 | 説明 |
---|---|
# # *
| 前の部分式と 0 回以上一致します。 たとえば、zo は「z」と「zoo」に一致します。 {0,} と同等。 |
| 前述の部分式と 1 回以上一致します。 たとえば、「zo 」は「zo」と「zoo」に一致しますが、「z」には一致しません。 {1,} と同等。 |
?
| この文字が量指定子として使用される場合、前の部分式と 0 回または 1 回一致することを意味します。 たとえば、 "do(es)?" は "do" または "does" と一致します。 ? {0,1} に相当します。 |
{n}
| n は負ではない整数です。特定の回数 n 回一致します。 たとえば、「o{2}」は「Bob」の「o」と一致することはできませんが、「food」の 2 つの o とは一致します。 |
{n,}
| n は負ではない整数です。少なくとも n 回一致します。 たとえば、「o{2,}」は「Bob」の「o」とは一致しませんが、「foooood」のすべての「o」には一致します。 「o{1,}」は「o 」と同等です。 「o{0,}」は「o*」と同等です。 |
{n,m}
| m と n は両方とも非負の整数であり、n たとえば、「o{1,3}」は「fooooood」の最初の 3 つの o と一致します。 「o{0,1}」は「o?」と同等です。カンマと 2 つの数字の間にスペースを入れることはできないことに注意してください。
説明 | ||
---|---|---|
\d
| 数字と一致します。 [0-9]と同等。
|
|
\D
| 数字以外の文字と一致します。 [^0-9]と同等。
|
|
\w
| 文字、数字、アンダースコアと一致します。 [A-Za-z0-9_]と同等。
|
|
\W
| 文字、数字、アンダースコア以外の文字に一致します。 [^A-Za-z0-9_]と同等。
|
|
\s
| スペース、タブ、フォーム フィードなどを含む任意の空白文字と一致します。 [ \f\n\r\t\v] と同等。
|
|
空白以外の任意の文字と一致します。 | [^ \f\n\r\t\v] と同等。
|
|
改行 (n、r) を除く任意の 1 文字と一致します。 | 「n」を含む任意の文字と一致するには、「(.
n)」のような正規表現を使用します。 |
説明 | |
---|---|
改行文字と一致します。 x0a および cJ に相当します。 |
|
復帰文字と一致します。 x0d および cM に相当します。 |
|
タブ文字と一致します。 x09 および cI に相当します。 |
説明 | |
---|---|
縦棒文字| は複数の選択に一致します。 | たとえば、「z|food」は「z」または「food」と一致します。 '(z|f|g)ood' は、「zood」、「food」、または「good」に一致します。
たとえば、「z|food」は「z」または「food」と一致します。 '(z|f)ood' は、「zood」または「food」と一致します。 | |||||||||||||||||
文字セット。含まれている文字のいずれかと一致します。 たとえば、 | [abc] は「plain」の「a」に一致します。
|
||||||||||||||||
負の値の文字セット。含まれていない任意の文字と一致します。 たとえば、 | [^abc] は、「plain」の 'p'、'l'、'i'、'n' に一致します。
|
||||||||||||||||
文字範囲。指定された範囲内の任意の文字と一致します。 たとえば、 | [a-z] は、「a」から「z」の範囲内の任意の小文字の英字と一致します。
|
||||||||||||||||
負の文字範囲。指定された範囲内にない任意の文字と一致します。 たとえば、 | [^a-z] は、「a」から「z」の範囲にない任意の文字に一致します。
|
文字 | 説明 |
---|---|
##? |
文字が他のリミッター (*, , ?, {n}, {n,}, {n,m}) の直後にある場合のパターンと一致します。 。 非貪欲モードは、検索文字列の可能な限り少ない部分と一致しますが、デフォルトの貪欲モードは、検索文字列の可能な限り多くの部分と一致します。 たとえば、文字列「oooo」の場合、「o ?」は 1 つの「o」に一致し、「o 」はすべての「o」に一致します。 |
( )
グループ文字 | 説明 |
---|---|
(パターン) |
パターンに一致し、この一致を取得します。括弧の文字と一致させるには、\( または \) を使用します。 |
(?:pattern) |
パターンに一致しますが、一致結果が得られません。これは、これが非取得一致であることを意味し、後で使用するために保存されません。これは、「or」文字 (|) を使用して正規表現の一部を結合する場合に便利です。 たとえば、'industr(?:y|ies) は、'industry|industries' よりも単純な式です。 |
(?=pattern) |
文字列一致パターンの先頭で先読み肯定アサート 検索文字列と一致します。これは非フェッチ一致です。つまり、後で使用するために一致をフェッチする必要はありません。 たとえば、「Windows(?=95|98|NT|2000)」は、「Windows2000」の「Windows」と一致しますが、「Windows3.1」の「Windows」と一致することはできません。プリフェッチでは文字は消費されません。つまり、一致が発生した後、次の一致の検索は、プリフェッチを含む文字の後に開始されるのではなく、最後の一致の直後に開始されます。 |
(?!pattern) |
正負のアサート (ネガティブ アサート)、パターンに一致しない文字列の先頭に一致します。弦。これは非フェッチ一致です。つまり、後で使用するために一致をフェッチする必要はありません。 たとえば、「Windows(?!95|98|NT|2000)」は、「Windows3.1」の「Windows」と一致しますが、「Windows2000」の「Windows」と一致することはできません。プリフェッチでは文字は消費されません。つまり、一致が発生した後、次の一致の検索は、プリフェッチを含む文字の後に開始されるのではなく、最後の一致の直後に開始されます。 |
##(?<=pattern)
| リバース (後方確認) ポジティブ事前チェックは、順方向ポジティブ事前チェックと似ていますが、次の点が異なります。反対方向。 たとえば、「(?<=95|98|NT|2000)Windows」は、「2000Windows」の「Windows」と一致しますが、「3.1Windows」の「Windows」と一致することはできません。 |
以上がPHPインタビューにおける正規表現の知識まとめ(超詳細)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。