ホームページ > バックエンド開発 > PHPチュートリアル > php_PHP チュートリアルの正規表現のサブパターンの詳細な説明

php_PHP チュートリアルの正規表現のサブパターンの詳細な説明

WBOY
リリース: 2016-07-13 10:56:07
オリジナル
839 人が閲覧しました

この記事では、PHP の正規表現のサブパターンについて詳しく説明しています。PHP の正規表現のサブパターンを知りたい人は参照してください。

機能
混合 preg_replace (混合パターン、混合置換、混合主語 [, int 制限])

特徴
パターンに一致するサブジェクトを検索し、それを置換に置き換えます。 limit が指定されている場合は、limit の一致のみが置き換えられます。limit が省略されている場合、または値が -1 の場合は、すべての一致が置き換えられます。
Replacement には、n または $n の形式で逆参照を含めることができます。n は 0 から 99 までの値を指定できます。n は、パターンの n 番目のサブパターンに一致するテキストを表します。

サブモード

$pattern パラメータの括弧で囲まれた正規表現。サブパターンの数は、左から右への括弧の数です。 (パターンはパターンです)

まず、PHP コードの一部を見てみましょう:

コードは次のとおりですコードをコピー表示結果:
$time = date ("Y-m-d H:i:s");
$pattern = "/d{4}-d{2}-d{2} d{2}:d{2}:d{2}/i"; If(preg_match($pattern,$time,$arr)){
echo "
";<br>
プリント_r($arr);
echo "
";
}
?>



配列

(

[0] => 2012-06-23 03:08:45

) 表示された結果には、一致パターンに一致する時刻形式のデータが 1 つだけ含まれていることに気づきましたか? では、レコードが 1 つしかない場合、なぜそれを配列に保存する必要があるのでしょうか?直接文字列として保存した方が良いのではないでしょうか?

この質問では、正規表現のサブパターンを見てみましょう。

正規表現では、「(」と「)」を使用してパターン内の部分文字列を囲み、サブパターンを形成できます。全体として考えると、サブパターンは 1 つの文字に相当します。

たとえば、上記のコードを少し変更して次のように変更します。

コードは次のとおりですコードをコピー $time = date ("Y-m-d H:i:s");
$pattern = "/(d{4})-(d{2})-(d{2}) (d{2}):(d{2}):(d{2})/i"; If(preg_match($pattern,$time,$arr)){
echo "
";<br>
プリント_r($arr);
echo "
";
}
?>



注: $pattern を変更し、一致するパターンで括弧 () を使用しただけです

実行結果:


配列
(
[0] => 2012-06-23 03:19:23
[1] => 2012年
[2] =>06
[3] => 23
[4] =>03
[5] => 19
[6] => 23
)
概要: 括弧を使用して、一致するパターン全体をグループ化できます。デフォルトでは、各グループには、グループの左括弧がマークとして、最初に表示されるグループ番号が自動的に付けられます。最初のグループはグループ番号 1、2 番目のグループはグループ番号 2 などとなります。このうち、グループ 0 が正規表現全体に相当します。正規一致パターン全体がグループ化された後、さらに「後方参照」を使用して、前のグループに一致するテキストを繰り返し検索できます。例: 1 はグループ 1 に一致するテキストを表し、2 はグループ 2 に一致するテキストを表します。以下のようにコードをさらに変更できます:

注:

二重引用符で囲まれているため、グループ化を使用する場合は 2 つのバックスラッシュを使用する必要があります (例: 1)。一重引用符で囲まれている場合は、次のようなバックスラッシュを 1 つだけ使用してください: 1
1 はグループ 1 のコンテンツをキャプチャするために使用されます: 2012, 6 はグループ 6 のコンテンツをキャプチャするために使用されます
実行結果:


$time の形式は次のとおりです: 2012-06-23 03:30:31
置き換えられた形式は次のとおりです: June 23, 2012 03:30:31
配列
(
[0] => 2012-06-23 03:30:31
[1] => 2012年
[2] =>06
[3] => 23
[4] =>03
[5] => 30
[6] => 31
)

高度な正規表現

POSIX BRE と ERE に加えて、libutilitis は TCL 8.2 と互換性のある高度な正規表現言語もサポートします
法律(ARE)。 ARE モードは、stRegEx パラメータに接頭辞「***:」を追加することで有効にできます。この接頭辞は
をカバーします。 カバー b拡張オプション。基本的に、ARE は ERE のスーパーセットです。 ERE
に基づいて以下のステップを実行します。 拡張子:

1. 「遅延マッチング」 (「非貪欲マッチング」または「最短マッチング」とも呼ばれます) をサポートします: '?'、'*'、'+' または '{m,n}' で
の後に「?」記号を追加すると、条件が満たされた場合に正規表現句が一致するように最短一致を有効にすることができます
できるだけ少ない文字と一致します (デフォルトでは、できるだけ多くの文字が一致します)。例: 「a.*b」を「abab」に適用します
「a.*?b」を使用すると、文字列全体 (「abab」) と一致します。「a.*?b」を使用した場合は、最初の 2 文字 (「ab」) のみと一致します。

2. 部分式の前方参照マッチングをサポート: stRegEx では、「n」を使用して以前に定義された前方参照を行うことができます
部分式。たとえば、「(a.*)1」は「abcabc」などと一致します。

3. 名前のない部分式: "(?:expression)" を使用して名前のない式を作成します。 名前のない式は
を返しません。 「n」一致にします。

4. 前方予測: 一致するには、指定された条件が前方に満たされる必要があります。 前向き予測はポジティブ予測とネガティブ予測に分かれます
2種類あります。肯定的な予測の構文は次のとおりです: "(?=expression)"、例: "bai.*(?=yang)" は "bai yang" と一致します
の最初の 4 文字 (「bai」) ですが、一致する場合、文字列には「bai.*」の後に「yang」.
が含まれていることを確認してください。 否定判定の構文は「(?!式)」です。例: 「bai.*(?!yang)」は「bai shan」の最初の
と一致します。 4 文字ですが、照合の際、文字列内の「bai.*」の後に「yang」が出現しないことが保証されます。

5. サポートモード切り替えプレフィックス「***:」の後に「(?パターン文字列)」の形式のパターン文字列を続けることができます。パターン
文字列は、後続の式のセマンティクスと動作に影響を与えます。パターン文字列には、次の文字を組み合わせることができます:

b - POSIX BRE モードに切り替え、bExtended オプションをオーバーライドします。
e - POSIX ERE モードに切り替えて、bExtended オプションをオーバーライドします。
q - テキスト リテラル マッチング モードに切り替え、式内の文字がテキストとして検索され、すべての正規表現がキャンセルされます
セマンティクス。このモードでは、通常のマッチングが単純な文字列検索に縮小されます。 「***=」プレフィックスはそのショートカット表現です
メソッド、意味: 「***=」は「***:(?q)」と同等です。

c - 大文字と小文字を区別したマッチングを実行し、bNoCase オプションをオーバーライドします。
i - 大文字と小文字を無視した一致を実行し、bNoCase オプションをオーバーライドします。

n - 行依存のマッチングを有効にする: '^' と '$' は行の先頭と末尾に一致し、否定セット ('[^...]') は一致しません。 改行文字と一致します。この機能は、「pw」パターン文字列と同等です。 bNewLine オプションをオーバーライドします。
m - 「n」と同じ。
p - '^' と '$' は文字列全体の先頭と末尾にのみ一致し、行 '.' および負のセットは改行には一致しません。
bNewLine オプションをオーバーライドします。
w - '^' と '$' は行の先頭と末尾に一致し、負のセットは改行に一致します。 bNewLine オプションをオーバーライドします。
s - 「^」と「$」は文字列全体の先頭と末尾にのみ一致し、行「.」は一致しません。また、負のセットは改行には一致しません。カバー
bNewLine オプションをカバーします。このモードは、ARE 状態でデフォルトで使用されます。

x - 拡張モードをオンにする: 拡張モードでは、式内の空白文字とコメント文字 '#' の後のコンテンツは無視されます
例:
@code@
(?x)
s+ ([[:graph:]]+) # 最初の数字
s+ ([[:graph:]]+) # 2 番目の数値
@code@
「s+([[:graph:]]+)s+([[:graph:]]+)」と同等。
T -空白とメモの内容を無視せずに拡張モードを閉じます。このモードは、ARE 状態でデフォルトで使用されます。

6. BRE/ERE モードとは異なる Perl スタイルの文字クラスのエスケープ シーケンス:

perl クラスと同等の POSIX 式の説明
-------------------------------------------------- ------------------------
リングキャラクター
A - 現在のパターンが何であっても、文字列全体の先頭のみが一致します
b - バックスペース文字 ('x08')
B - エスケープ文字自体 ('')
cX - 制御記号-X (= X & 037)
d ? d [^[:digit:]] e - 終了文字 ('x1B')
f - フォーム フィード ('x0C')
m [[:<:]] 単語の開始位置
m [[:&gt;:]] n - 改行文字 ('x0A')
r - 復帰文字 ('x0D')
s [[:space:]] [[:space:]] s [^[:space:]] t - タブ文字 ('x09')
uX - 16 ビット UNICODE 文字 (X∈[0000 .. FFFF])
UX - 32 ビット UNICODE 文字 (X∈[00000000 .. FFFFFFFF])
v - 垂直タブ文字 ('x0B')
w [[:alnum:]_] 単語を構成する文字
W [^[:alnum:]_] 単語以外の文字
xX - 8 ビット文字 (X∈[00 .. FF])
y - 単語境界 (m または M)
Y - 非単語境界
Z - 現在のモードに関係なく、文字列の最後の部分のみが一致します
- NULL、空文字
X - 部分式の前方参照 (X∈[1 .. 9])
XX - 部分式の前方参照、または 8 進表記の 8 文字
XXX - 部分式の前方参照、または 8 進表記の 8 文字

コードは次のとおりです コードをコピー
$time = date ("Y-m-d H:i:s");
$pattern = "/(d{4})-(d{2})-(d{2}) (d{2}):(d{2}):(d{2})/i";
$replacement = "$time の形式は次のとおりです: $0
置き換えられた形式は次のとおりです: 1 年 2 月 3 日 4 時間 5 分 6 秒";
print preg_replace($pattern, $replacement, $time);
If(preg_match($pattern,$time,$arr)){
echo "
";<br>
print_r($arr);
echo "
";
}
?>

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632203.html技術記事この記事では、PHP の正規表現のサブパターンについて詳しく説明しています。PHP の正規表現のサブパターンを知りたい人は参照してください。 関数mixed preg_replace (混合パターン,...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート