ホームページ  >  記事  >  バックエンド開発  >  phpの定常処理関数のまとめと分析_PHPチュートリアル

phpの定常処理関数のまとめと分析_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-21 15:51:39789ブラウズ

+ グループ。その中には、指定されたパターンに一致する入力配列内のセルが含まれます。

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);

?>

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 ("/(\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",
"Call 555-1212 or 1-800-555-1212", $phones);
?>



例 2. 一致する HTML タグを検索します (貪欲)

< ;?php
// \2 は逆参照の例です。PCRE での意味は、
// が正規表現自体の 2 番目の括弧内の内容と一致する必要があるということです。この場合、
// は ([ w]+)。文字列は二重引用符で囲まれているため、バックスラッシュを追加するには
// が必要です。
$html = "太字クリックしてください"

preg_match_all ("/(<([w]+)[^> ;]*>)(.*)()/", $html, $matches);

for ($i=0; $i< count($matches[0]); $ i++) {
echo "一致しました: ".$matches[0][$i]."n";
echo "パート 1: ".$matches[1][$i]."n"; 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() example

$keywords = 'g3/400 の場合は 40 ドル';
$keywords($keywords, '/');
echo $keywords; / は g3/400 の場合 $40 を返します
?> 正規表現にアスタリスクを含めないでください
// には特別な意味があります。

$textbody = "この本は*非常に*見つけるのが難しいです。";
$word = "*非常に*";
$textbody = preg_replace ("/".preg_quote($word)."/",
" ".$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とreplacementが両方とも配列の場合、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。="ラストクリスマスは12/24/2001n "; (d{2}/d{2}/)(d{4})|",
エイプリルフールは 2003 年 4 月 1 日です l // 去年のクリスマスは 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("stdin を読み取れません");
while (!feof($fp)) {
$line = fgets($fp); line = preg_replace_callback(
' $matches',
' return strto lower ($matches[0]);


最後に

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 が -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() などのより高速な (そしてよりシンプルな) 代替関数を使用することを選択できます。

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/319064.html技術記事 preg_grep (PHP4,PHP5) preg_grep--パターンに一致する配列ユニットを返します。 説明 arraypreg_grep(stringpattern,arrayinput[,intflags]) preg_grep() は、入力を含む配列を返します...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。