preg_grep
(PHP 4, PHP 5)
preg_grep -- パターンに一致する配列要素を返します
Description
array preg_grep (string pattern, array input [, int flags]) )
preg_grep() は、指定されたパターンに一致する入力配列内のセルを含む配列を返します。
フラグには次のフラグを指定できます:
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);
?>preg_match;
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_match -- 正規表現マッチングを実行します
Description
int preg_match ( string pattern, string subject [, array matches [, int flags]] )
pattern で指定された正規表現に一致するコンテンツを対象の文字列で検索します。
一致するものが提供された場合、検索結果が入力されます。 $matches[0] にはパターン全体に一致するテキストが含まれ、$matches[1] には括弧内の最初にキャプチャされたサブパターンに一致するテキストが含まれます。
フラグには次のタグを使用できます:
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 ("/(\bweb\b)\s(\d)/i", "PHP is the web 45 scripting web 34 language of choice.",$match)) {
print "A match was found.";
print_r($match);
} else {
print "A match was not found.";
}
?>
// 从 URL 中取得主机名
preg_match("/^(http:\/\/)?([^\/]+)/i",
"http://www.php.net/index.html", $matches);
$host = $matches[2];
// 从主机名中取得后面两段
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
echo "domain name is: {$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",
"555-1212 または 1-800-555-1212 に電話してください", $phones);
?>
例 2. 一致する HTML タグの検索 (貪欲)
// \2 は逆参照の例であり、PCRE での意味 Yes
// は、正規表現自体の 2 番目の括弧セット内の内容と一致する必要があります。この例では、
// は ([w] ) です。文字列は二重引用符で囲まれているため、
// を追加してバックスラッシュを追加する必要があります。
$html = "
太字クリックしてください";
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() の例
$keywords = '$40 for a g3/400'
$keywords = preg_quote($keywords) , '/');
echo $keywords; // g3/400 の場合は $40 を返します
?>例 2. 特定のテキスト内の単語を指定します。イタリックタグを追加します
// この例では、preg_quote($word) を使用して、正規表現
// にないアスタリスクを特別な意味にします。
$textbody = "この本は *非常に * 見つけにくいです。";
$word = "*非常に*"
$textbody = preg_replace ("/".preg_quote($word) )."/",
"
".$word."",
$textbody);
次のステップは、非常に柔軟で非常に強力で広く使用されている preg_replace 関数を適用することです。
preg_replace
(PHP 3 >= 3.0.9, PHP 4, PHP 5)
preg_replace -- 正規表現の検索と置換を実行します
手順
混合 preg_replace (混合パターン、混合置換、混合主語 [, int limit] )
主語内のパターン pattern に一致するものを検索し、置換で置換します。 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 -- コールバック関数を使用して正規表現の検索と置換を実行します
説明
混合preg_replace_callback (混合パターン、コールバックコールバック、混合主語 [, int limit] )
この関数の動作は、置換パラメータを提供する代わりにコールバックを提供することを除いて、preg_replace() とほぼ同じです。関数が指定されています。この関数は、ターゲット文字列内の一致の配列を入力として受け取り、置換に使用される文字列を返します。
例 1. preg_replace_callback() の例
// このテキストは 2002 年用です。
// これを 2003 年でも利用できるようにしたいと思います
$text = "エイプリルフールは 2002 年 4 月 1 日です";
$text.= "最後のクリスマスは 2001 年 12 月 24 日です";
// コールバック関数
関数 next_year ($matches) {
// 通常: $matches[0] は完全一致
// $matches[1] は最初の括弧で囲まれたサブパターンの一致
// 以下同様
return $matches[1].($matches[2] 1);
}
echo preg_replace_callback(
“|(d{2}/d{2 }/)(d{4 })|",
"next_year",
$text); 2003
// 前回のクリスマスは 2002 年 12 月 24 日でした
?&
あなた多くの場合、preg_replace_callback() のコールバック関数は 1 か所で必要になります。この場合、create_function() を使用して、preg_replace_callback() の呼び出し内で匿名関数をコールバックとして宣言できます。
preg_replace_callback() 関数を使用する人には、おそらくコールバック関数が必要です (そうでない場合は、なぜ使用する必要があります)。 preg_replace を直接使用するほうがよいのではないでしょうか)。ただし、多くの場合、それは 1 か所でのみ使用されます。この場合、create_function() を使用して、無名関数を preg_replace_callback() のコールバック関数として宣言できます。このようにして、二度と使用されない関数名に混乱することなく情報を宣言する必要性を満たします。
例 2. preg_replace_callback() と create_function()
/* 各段落の先頭にある
を削除する UNIX スタイルのコマンド ライン フィルター* 大文字を小文字に変換します */
$fp = fopen("php://stdin", "r") または die("can't read stdin"); feof ($fp)) {
$line = fgets($fp);
$line = preg_replace_callback(
'|
s*w|',
create_function(
/ /単一引用符を使用するための鍵は次のとおりです。
// それ以外の場合は、すべての $ を $
'$ に一致',
' Return StrTo lower ($ は [0] に一致); に置き換えます。 🎜> $line
);
echo $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]] )
パターンに一致する境界に沿った subject のエッジを含む配列を返します Split部分文字列。
limit が指定されている場合、limit が -1 の場合は、制限がないことを意味し、オプションのパラメーター フラグの指定を続けることができます。
フラグは、次のフラグの任意の組み合わせになります (ビットごとの OR 演算子 | と組み合わせます):
PREG_SPLIT_NO_EMPTY
このフラグが設定されている場合、preg_split() のみが返されます。 -null コンポーネント。
PREG_SPLIT_DELIM_CAPTURE
このフラグが設定されている場合、区切り文字パターン内の括弧式もキャプチャされて返されます。このタグはPHP 4.0.5で追加されました。
PREG_SPLIT_OFFSET_CAPTURE
このフラグが設定されている場合、各一致結果に関連付けられた文字列オフセットも返されます。これにより、返された配列の値が変更され、その中の各セルも配列になることに注意してください。最初の項目は一致した文字列で、2 番目の項目は subject 内のそのオフセットです。このタグは PHP 4.3.0 以降で使用できます。
ヒント: 正規表現の機能が必要ない場合は、explode() や str_split() などのより高速な (そしてよりシンプルな) 代替関数を使用することを選択できます。