preg_grep
(PHP 4, PHP 5)
preg_grep -- パターンに一致する配列要素を返します
説明
array preg_grep ( string pattern, array input [, int flags] )
preg_grep() 入力を含む配列を返します 内のセル指定されたパターンに一致する配列。
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]] )
pattern Matching コンテンツで指定された正規表現を件名文字列内で検索します。
一致するものが提供された場合、検索結果が入力されます。 $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 スクリプト言語の選択です。",$match)) {
print "A match ";
print_r($match);
} else {
"一致するものが見つかりませんでした。";
}
?>
// URL からホスト名を取得します
preg_match( "/^(http://)?([^/]+)/i",
"http://www.php.net/index.html", $matches);
$host = $matches[2 ];
// ホスト名から次の 2 つのセグメントを取得します
preg_match("/[^./]+.[^./]+$/", $host, $matches); { $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, array matches [, int flags] )
在 subject 中搜索所有与 pattern 给出的正则表达式匹配的内容并将结果以 flags 指定的顺序放到 matches 中。
搜索到第一个匹配项之后,接下来的搜索从上一个匹配项末尾开始。
flags 可以是下列标记的组合(注意把 PREG_PATTERN_ORDER 和 PREG_SET_ORDER 合起来用没有意义):
PREG_PATTERN_ORDER
对结果排序使 $matches[0] 为全部模式匹配的数组,$matches[1] 为第一个括号中的子模式所匹配的字符串组成的数组,以此类推。
preg_match_all ("|<[^>]+>(.*)[^>]+>|U",
"
example: this is a test
",
$out, PREG_PATTERN_ORDER);
print $out[0][0].", ".$out[0][1]."\n";
print $out[1][0].", ".$out[1][1]."\n";
?>
本例将输出:
example: ,
this is a test
example: , this is a test
因此,$out[0] 包含匹配整个模式的字符串,$out[1] 包含一对 HTML 标记之间的字符串。
PREG_SET_ORDER
对结果排序使 $matches[0] 为第一组匹配项的数组,$matches[1] 为第二组匹配项的数组,以此类推。
preg_match_all ("|<[^>]+>(.*)[^>]+>|U",
"
example: this is a test
",
$out, PREG_SET_ORDER);
print $out[0][0].", ".$out[0][1]."\n";
print $out[1][0].", ".$out[1][1]."\n";
?>
本例将输出:
example: , example:
this is a test
、これはテストです
この例では、$matches[0] は一致結果の最初のセットで、$matches[0][0] にはパターン全体に一致するテキストが含まれ、$matches[0][1] には次のものが含まれます一致する結果の最初のセット、サブパターンのテキストなど。同様に、$matches[1] は 2 番目の一致セットであり、以下同様です。
PREG_OFFSET_CAPTURE
このフラグが設定されている場合、各一致結果に関連付けられた文字列オフセットも返されます。これにより、返された配列の値が変更され、その中の各セルも配列になることに注意してください。最初の項目は一致した文字列で、2 番目の項目は subject 内のそのオフセットです。このタグは PHP 4.3.0 以降で使用できます。
タグが指定されていない場合は、PREG_PATTERN_ORDER が想定されます。
パターン全体が一致した回数 (おそらくゼロ) を返し、エラーが発生した場合は FALSE を返します。
例 1. 特定のテキストからすべての電話番号を取得する
preg_match_all ("/(? (d{3})? )? (?(1) [-s] ) d{3}-d { 4}/x",
"Call 555-1212 or 1-800-555-1212", $phones);
?>
例 2. 一致する HTML タグを検索する (貪欲)
/ / \2 は逆参照の例です。PCRE での意味は、
// が正規表現自体の 2 番目の括弧内の内容と一致する必要があるということです。この場合、
// は ([w]+) です。文字列は二重引用符で囲まれているため、バックスラッシュを追加するには
// が必要です。
$html = "
太字クリックしてください";
preg_match_all ("/(<([w]+)[^> ]*>)(.*)(\2>)/", $html, $matches);
for ($i=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() の例
$keywords = 'g3/400 の場合は 40 ドル';
$keywords($keywords, '/'); // を返します。 $40 for a g3/400
?>
// 式内の には特別な意味があります。
$textbody = "この本は *とても* 見つけにくいです。";
$word = "*とても*";
$textbody = preg_replace ("/".preg_quote($word)."/",
"< ;i>".$word."",
$textbody);
preg_replace
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_replace -- 正規表現の検索と置換を実行します
手順
mixed preg_replace (混合パターン、混合置換、混合主語 [, int 制限] )
件名で一致するパターンを検索し、置換に置き換えます。 limit が指定されている場合、limit の一致のみが置換されます。limit が省略されている場合、または値が -1 の場合は、すべての一致が置換されます。
replacement には、 \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() は、subject を検索して置換するためにそれらから値を取り出します。置換の値がパターンの値よりも少ない場合、空の文字列が残りの置換値として使用されます。 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 -- コールバック関数を使用して正規表現の検索と置換を実行します
説明
mixed preg_replace_callback (混合パターン、コールバックコールバック、混合主語 [, int 制限] )
この関数の動作は preg_replace() とほぼ同じですが、置換パラメータを提供する代わりにコールバック関数が指定されている点が異なります。この関数は、ターゲット文字列内の一致の配列を入力として受け取り、置換に使用される文字列を返します。
例 1. preg_replace_callback() example
//このテキストは 2002 年用です。
//今度は 2003 年にも利用できるようにしたいです
$text = "エイプリル フールの日は 04/01/ 2002n";
$text.= "最後のクリスマスは 2001 年 12 月 24 日でした";
// コールバック関数
function next_year($matches) {
通常: $matches[0] は完全一致
// $ Matches [1] は最初の括弧内のサブモードの一致する項目
// Return $ は [1] に一致します ($ は [2] +1 に一致します)(d{2}/d{2}/); })|",
"next_year",
$text);
// 前回のクリスマスは 2002 年 12 月 24 日でした
?>
preg_replace_callback() の back 関数を 1 か所だけで使用します。この場合、create_function() を使用して、preg_replace_callback() の呼び出し内で匿名関数をコールバックとして宣言できます。このようにすることで、呼び出しに関するすべての情報が 1 か所に集まり、関数の名前空間がコールバック関数名で乱雑になることがなくなります。他の場所では使用されていません。
preg_replace_callback() 関数を使用する友人の場合は、コールバック関数が必要です (そうでない場合、なぜ使用するのでしょうか? preg_replace を直接使用した方が良いのではないでしょうか) が、多くの場合、1 か所でのみ使用されます。 。この場合、create_function() を使用して、無名関数を preg_replace_callback() のコールバック関数として宣言できます。このようにして、二度と使用されない関数名に混乱することなく情報を宣言する必要性を満たします。
例 2. preg_replace_callback() と create_function()
/* UNIX スタイルのコマンド ライン フィルター
* 各段落の先頭の大文字を小文字に変換します */
$fp = fopen( " php://stdin", "r") または die("stdin を読み取れません");
while (!feof($fp)) {
$line = fgets($fp);
$line = preg_replace_callback (
'$ matches' 'return strower($ matches [0];'文字列
詳細はありません。
説明
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 番目の項目は subject 内のそのオフセットです。このタグは PHP 4.3.0 以降で使用できます。
ヒント: 正規表現の機能が必要ない場合は、explode() や str_split() などのより高速な (そしてよりシンプルな) 代替関数を使用することを選択できます。
以上、プリティーリズム・ディアマイフューチャーPHPの定常処理関数の概要と解析を紹介しましたが、プリティーリズム・ディアマイフューチャーの内容も含めて、PHPチュートリアルに興味のある方の参考になれば幸いです。