以下は、PHP 正規表現 preg_grep の学習を容易にする、PHP の正規表現の一般的な関数コードのコレクションです
。
(PHP4、PHP5)
preg_grep -- パターンに一致する配列セルの説明を返します。
array preg_grep ( string pattern, array input [, int flags] )
preg_grep() 指定されたパターン pattern に一致する入力配列内のセルを含む配列を返します。
flags には次のフラグを指定できます:
PREG_GREP_INVERT
このフラグで渡された場合、 preg_grep() は、指定されたパターンに一致しない入力配列内のセルを返します。このタグは PHP 4.2.0 以降で使用できます。
PHP 4.0.4 以降、preg_grep() によって返される結果には、入力配列のキーを使用してインデックスが付けられます。このような結果が望ましくない場合は、array_values() を使用して、preg_grep() によって返された結果のインデックスを再作成します。
以上がマニュアルのpreg_grep()の記述です。まず、これは perl 互換の正規関数なので、preg_grep は p(perl)reg(正規)_grep を意味すると思いますが、独自の拡張により正規の関数として使用できることが特徴です。多次元配列での照合を行い、flags パラメーターを通じて一致する配列または一致しない配列を返すことができます。その効率は foreach(...){if...} 構造 (未検証) を使用するよりもはるかに高速であり、複雑なパターンに一致することができます。検索や並べ替えなどのアプリケーションに非常に役立ちます。
例:
<?
$arr = array('abc'=>12.213,'bb'=>12345,'ba'=>23.2321,34.3,'23'=>'3.3','23434'=>'bbb');
// 浮動小数点数を含むすべての配列要素を返します。
$fl_array = preg_grep ("/^(d+)?.d+$/", $arr);
print_r($fl_array);
?>
preg_match
(PHP 3 >= 3.0.9、PHP 4、PHP 5)
preg_match -- 正規表現のマッチング命令
int preg_match (string pattern, string subject [, arraymatches [, int flags]] ) は、
パターンで指定された正規表現に一致する内容のサブジェクト文字列を検索します。
一致するものが提供された場合は、検索結果が入力されます。 $matches[0] にはパターン全体に一致するテキストが含まれ、$matches[1] には括弧内の最初にキャプチャされたサブパターンに一致するテキストが含まれます。
flags には次のフラグを指定できます:
PREG_OFFSET_CAPTURE
このフラグが設定されている場合、一致が発生するたびに、関連付けられた文字列オフセットも返されます。これにより、返された配列の値が変更され、その中の各セルも配列になることに注意してください。最初の項目は一致した文字列で、2 番目の項目はそのオフセットです。このタグは PHP 4.3.0 以降で使用できます。
flags パラメータは、PHP 4.3.0 以降で使用できます。
preg_match() はパターンが一致した回数を返します。 preg_match() は最初の一致後に検索を停止するため、0 回 (一致なし) または 1 回のいずれかになります。逆に、 preg_match_all() は件名の終わりまで検索します。エラーが発生した場合、preg_match() は FALSE を返します。
ヒント: ある文字列が別の文字列内に含まれているかどうかを確認したいだけの場合は、 preg_match() を使用しないでください。代わりに、はるかに高速な strpos() または strstr() を使用できます。
以上がマニュアルのpreg_match()の説明ですが、この関数の役割は、ある文字列が一定の要件を満たしているかどうかの検証に使えることだと思います。制限は、前述したように、0 回または 1 回のいずれかに一致することです。そして戻り値は一致した数です。完全な一致が必要な場合は、 preg_match_all() を使用できます。これは、自己パターンの戻り値として使用できる、場合によっては役立つ $matches 配列の役割にも言及する価値があります。
例:
<?
if (preg_match ("/(bwebb)s(d)/i", "PHP は Web 45 スクリプト Web 34 言語として最適です。",$match)) {
print "一致するものが見つかりました。";
print_r($match);
} それ以外 {
print "一致するものが見つかりませんでした。";
}
?>
<?php
// URLからホスト名を取得
preg_match("/^(http://)?([^/]+)/i",
" http://www.php.net/index.html "、$matches);
$host = $matches[2];
// ホスト名から次の 2 つのセグメントを取得します
preg_match("/[^./]+.[^./]+$/", $host, $matches);
echo "ドメイン名は: {$matches[0]}n";
?>
preg_match_all
(PHP 3 >= 3.0.9、PHP 4、PHP 5)
preg_match_all -- グローバル正規表現マッチングを実行します。マニュアルのこの関数の説明は非常に明確なので、これ以上は説明しません。
説明する
int preg_match_all (string pattern, string subject, arraymatches [, int flags]) は、
pattern で指定された正規表現に一致する subject 内のすべてのコンテンツを検索し、結果を flags で指定された順序で一致に入れます。
最初の一致が見つかった後、前の一致の終わりから後続の検索が開始されます。
flags には、次のフラグを組み合わせることができます (PREG_PATTERN_ORDER と PREG_SET_ORDER を一緒に使用しても意味がないことに注意してください):
PREG_PATTERN_ORDER
$matches[0] がすべてのパターン一致の配列、$matches[1] が最初の括弧内のサブパターンと一致する文字列の配列になるように、結果を並べ替えます。
<?php
preg_match_all ("|<[^>]+>(.*)</[^>]+>|U", "<b>例: </b><div align=left>これはテストです</div >"、
$out、PREG_PATTERN_ORDER);
print $out[0][0].", ".$out[0][1]."n";
print $out[1][0].", ".$out[1][1]."n";
?>
この例では次のように出力されます:
<b>例: </b>, <div align=left>これはテストです</div>
例: 、これはテストです
。 したがって、$out[0] にはパターン全体に一致する文字列が含まれ、$out[1] には HTML タグのペア間の文字列が含まれます。
PREG_SET_ORDER
$matches[0] が最初の一致セットの配列、$matches[1] が 2 番目の一致セットの配列、というように結果を並べ替えます。
<?php
preg_match_all ("|<[^>]+>(.*)</[^>]+>|U",
"<b>例: </b><div align=left>これはテストです</div>",
$out、PREG_SET_ORDER);
print $out[0][0].", ".$out[0][1]."n";
print $out[1][0].", ".$out[1][1]."n";
?>
この例では次のように出力されます。
<b>例: </b>、例:
<div align=left>これはテストです</div>、これはテストです
この例では、$matches[0] は一致結果の最初のセットで、$matches[0][0] にはパターン全体に一致するテキストが含まれ、$matches[0][1] には最初のサブパターンに一致するテキストが含まれます。 、などで終わります。同様に、$matches[1] は 2 番目の一致セットであり、以下同様です。
PREG_OFFSET_CAPTURE
このフラグが設定されている場合、一致が発生するたびに、関連付けられた文字列オフセットも返されます。これにより、返される配列の値が変更され、各セルも配列になることに注意してください。最初の項目は一致した文字列で、2 番目の項目はサブジェクト内のそのオフセットです。このタグは PHP 4.3.0 以降で使用できます。
タグが指定されていない場合は、PREG_PATTERN_ORDER が想定されます。
パターン全体が一致した回数 (おそらくゼロ)、またはエラーの場合は FALSE を返します。
例 1. テキストメッセージからすべての電話番号を取得する
<?php
preg_match_all ("/(? (d{3})? )? (?(1) [-s] ) d{3}-d{4}/x",
「555-1212 または 1-800-555-1212 に電話してください」、$phones);
?>
例 2. 一致する HTML タグを検索する (貪欲)
<?php
// \2 は逆参照の例で、PCRE での意味は次のとおりです。
// この場合、正規表現自体の 2 番目の括弧セット内の内容と一致する必要があります。
// それは ([w]+) です。文字列は二重引用符で囲まれているため、
// 余分なバックスラッシュを追加します。
$html = "<b>太字</b><a href=howdy.html>クリックしてください</a>";
preg_match_all ("/(<([w]+)[^>]*>)(.*)(</\2>)/", $html, $matches);
for ($i=0; $i< count($matches[0]); $i++) {
echo "一致しました: ".$matches[0][$i]."n";
echo "パート 1: ".$matches[1][$i]."n";
echo "パート 2: ".$matches[3][$i]."n";
echo "パート 3: ".$matches[4][$i]."nn";
}
?>
preg_quote
(PHP 3 >= 3.0.9、PHP 4、PHP 5)
preg_quote -- 正規表現文字の説明をエスケープします。
string preg_quote ( string str [, string delimiter] )
preg_quote() は、 str をパラメータとして受け取り、正規表現構文に属する各文字の前にバックスラッシュを追加します。動的に生成された文字列をパターンとして照合する必要がある場合は、この関数を使用して、文字列に含まれる可能性のある特殊文字をエスケープできます。
オプションの引数区切り文字が指定されている場合、この文字もエスケープされます。 PCRE 関数で必要な区切り文字をエスケープするために使用できます。最も一般的に使用される区切り文字はスラッシュ / です。
正規表現の特殊文字は次のとおりです。 + * [ ^ ] $ ( ) = !
注: この関数はバイナリ オブジェクトに対して安全に使用できます。
上記はマニュアルの説明で非常にわかりやすいので省略します。また、マニュアルにはこの関数はバイナリオブジェクトに対して安全に使用できるとの注記があり、非常に便利です。
例: 例 1. preg_quote() の例
<?php
$keywords = 'g3/400 は 40 ドル';
$keywords = preg_quote($keywords, '/');
echo $keywords; // g3/400 の場合は $40 を返します。
?>
例 2. テキスト内の単語に斜体を追加する
<?php
// この例では、アスタリスクを正規表現から除外するために preg_quote($word) が使用されています
// 特別な意味があります。
$textbody = "この本は*非常に*見つけるのが難しいです。";
$word = "*とても*";
$textbody = preg_replace ("/".preg_quote($word)."/",
"<i>".$word."</i>",
$textbody);
?>
次のステップは、非常に柔軟で、非常に強力で、非常に広く使用されている preg_replace 関数を適用することです。
preg_replace
(PHP 3 >= 3.0.9、PHP 4、PHP 5)
preg_replace – 正規表現の検索と置換命令を実行します。
mixed preg_replace (混合パターン、混合置換、混合主語 [, int limit]) は、
主語でパターン pattern の一致を検索し、それらを置換で置換します。 limit が指定されている場合、limit の一致のみが置換されます。limit が省略されている場合、または値が -1 の場合は、すべての一致が置換されます。
replace には、 \n形式、または (PHP 4.0.4 以降) $n 形式の後方参照を含めることができますが、後者の方が優先されます。このような各参照は、n 番目にキャプチャされた括弧で囲まれたサブパターンに一致するテキストに置き換えられます。 n の範囲は 0 ~ 99 で、 \0または $0 はパターン全体と一致するテキストを指します。左括弧を左から右に数えて (1 から開始)、サブパターンの数を取得します。
数値による後方参照の後に続く置換パターン (つまり、一致するパターンの直後の数値) の場合、後方参照を表すために使い慣れた\1表記を使用することはできません。たとえば、 \11 を使用すると、 preg_replace() は、 \1の後に数値 1 が続く後方参照が必要なのか、それとも\11の後方参照が必要なのか混乱します。この場合の解決策は、${1}1 を使用することです。これにより、$1 の分離された後方参照が作成され、他の 1 は単なるリテラルのままになります。
一致するものが見つかった場合は、置換された件名が返され、一致しない場合は、元の件名が返されます。
preg_replace() の各パラメータ (limit を除く) は配列にすることができます。 pattern と replace の両方が配列の場合、キーが配列内に出現する順序で処理されます。これは、インデックスの番号順と必ずしも同じではありません。どのパターンをどの置換で置き換えるかを識別するためにインデックスを使用する場合、preg_replace() を呼び出す前に配列を ksort() でソートする必要があります。
subject が配列の場合、subject 内の各項目に対して検索と置換が実行され、配列が返されます。
pattern と replace が両方とも配列の場合、preg_replace() はサブジェクトを検索して置換するためにそれらから値を取り出します。置換の値がパターンの値よりも少ない場合、空の文字列が残りの置換値として使用されます。 pattern が配列で、replacement が文字列である場合、この文字列は pattern の各値の置換値として使用されます。その逆は無意味です。
/e 修飾子を使用すると、 preg_replace() は置換引数を PHP コードとして処理します (適切な後方参照が置換された後)。ヒント: 置換によって有効な PHP コード文字列が形成されていることを確認してください。そうでない場合、PHP は preg_replace() を含む行で構文解析エラーを報告します。
注:limit パラメータは、PHP 4.0.1pl2 以降に追加されました。
文字列だけでなく配列も扱えることと、逆参照機能が柔軟なところが強みだと思います。基本的に、通常のユーザーのニーズのほとんどを満たすことができますが、それが適切でない場合でも、高度な要件を満たすようにコールバック関数をカスタマイズできる preg_replace_callback() 関数もあります。フィルターの設計など。
preg_replace_callback
(PHP 4 >= 4.0.5、PHP 5)
preg_replace_callback -- コールバック関数を使用して正規表現検索を実行し、命令を置換します
混合 preg_replace_callback (混合パターン、コールバック コールバック、混合サブジェクト [, int limit])
この関数は、置換パラメータを提供する代わりにコールバック関数が指定されることを除いて、preg_replace() とほぼ同様に動作します。この関数は、ターゲット文字列内の一致の配列を入力として受け取り、置換に使用される文字列を返します。
例 1. preg_replace_callback() の例
<?php
// このテキストは 2002 年のものです。
// 2003 年に利用できるようにしたい
$text = "エイプリルフールは 2002 年 4 月 1 日ですn";
$text.= "前回のクリスマスは 2001 年 12 月 24 日でしたn";
// コールバック関数
関数 next_year($matches) {
// 通常: $matches[0] が完全一致です
// $matches[1] は最初の括弧内のサブパターンの一致です
// 等々
$matches[1].($matches[2]+1) を返します。
}
echo preg_replace_callback(
"|(d{2}/d{2}/)(d{4})|",
"来年",
$text);
//結果は次のようになります。
// エイプリルフールは 2003 年 4 月 1 日です
// 去年のクリスマスは 2002 年 12 月 24 日でした
?>
preg_replace_callback() のコールバック関数が 1 か所で必要になることがよくあります。この場合、create_function() を使用して、preg_replace_callback() の呼び出し内で匿名関数をコールバックとして宣言できます。呼び出しに関するすべての情報を 1 か所にまとめ、他では使用されていないコールバック関数名で関数名前空間を乱雑にしないでください。
preg_replace_callback() 関数を使用する友人の場合は、おそらくコールバック関数が必要になるはずです (そうでない場合、なぜそれを使用するのでしょうか? preg_replace を直接使用する方が良いのではないでしょうか) が、多くの場合、この関数は 1 か所でのみ使用されます。この場合、create_function() を使用して、無名関数を preg_replace_callback() のコールバック関数として宣言できます。このようにして、二度と使用されない関数名に混乱することなく情報を宣言する必要性を満たします。
例 2. preg_replace_callback() と create_function()
<?php
/* 各段落の先頭の文字列を削除する UNIX スタイルのコマンド ライン フィルター
*大文字を小文字に変換*/
$fp = fopen("php://stdin", "r") または die("stdin を読み取れません");
while (!feof($fp)) {
$line = fgets($fp);
$line = preg_replace_callback(
'|<p>s*w|',
作成_関数(
// ここでの一重引用符の使用は重要です。
// それ以外の場合は、すべての $ を $ に置き換えます
'$マッチ',
'return strto lower($matches[0]);'
)、
$line
);
$line をエコーします。
}
fclose($fp);
?>
最後に
preg_split
(PHP 3 >= 3.0.9、PHP 4、PHP 5)
preg_split – 正規表現を使用して文字列を分割します。ここでは詳しく説明しません。
説明する
array preg_split ( string pattern, string subject [, int limit [, int flags]] ) は、
パターンに一致する境界に沿って分割された件名の部分文字列を含む配列を返します。
limit が指定されている場合、最大でも limit の部分文字列が返されます。limit が -1 の場合は、制限がないことを意味し、オプションのパラメーター フラグの指定を続けることができます。
flags には、次のフラグを任意に組み合わせることができます (ビットごとの OR 演算子 | と組み合わせます):
PREG_SPLIT_NO_EMPTY
このフラグが設定されている場合、preg_split() は空ではないコンポーネントのみを返します。
PREG_SPLIT_DELIM_CAPTURE
このフラグが設定されている場合、区切り文字パターン内の括弧式もキャプチャされて返されます。このタグはPHP 4.0.5で追加されました。
PREG_SPLIT_OFFSET_CAPTURE
このフラグが設定されている場合、一致する結果が出現するたびに関連付けられた文字列オフセットも返されます。これにより、返される配列の値が変更され、各セルも配列になることに注意してください。最初の項目は一致した文字列で、2 番目の項目はサブジェクト内のそのオフセットです。このタグは PHP 4.3.0 以降で使用できます。
ヒント: 正規表現の力が必要ない場合は、explode() や str_split() などのより高速な (そしてより単純な) 代替手段を使用することを選択できます。