ホームページ >バックエンド開発 >PHPチュートリアル >POSIX スタイルと互換性のある Perl スタイルの正規表現の 2 つの主要な関数の類似点 (preg_match、preg_replace、_PHP チュートリアル)

POSIX スタイルと互換性のある Perl スタイルの正規表現の 2 つの主要な関数の類似点 (preg_match、preg_replace、_PHP チュートリアル)

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

まず、POSIX スタイルの正規表現の 2 つの主要な関数を見てみましょう:

ereg 関数: (正規表現のマッチング)

形式: int ereg ( string pattern, string string [, array ®s] )
注: 使用Perl との互換性 正規表現構文の preg_match() 関数は、多くの場合、ereg() のより高速な代替手段です。 (一般的に言えば、preg_match() を使用する方が良いです。その方が良いです~~)

大文字と小文字を区別して、文字列内の指定された正規表現パターンに一致する部分文字列を検索します。 pattern の括弧で囲まれたサブパターンに一致する部分文字列が見つかり、関数呼び出しに 3 番目の引数 regs が指定されている場合、一致は regs 配列に格納されます。 $regs[1] には最初の左括弧で始まる部分文字列が含まれ、$regs[2] には 2 番目の部分文字列が含まれます。 $regs[0] には、一致した文字列全体が含まれます。

戻り値: 文字列内でパターン pattern の一致が見つかった場合は、一致した文字列の長さが返されます。一致が見つからない場合、またはエラーが発生した場合は、FALSE が返されます。オプションのパラメータ regs が渡されない場合、または一致した文字列の長さが 0 の場合、この関数は 1 を返します。

ereg() 関数の例を見てみましょう:

次のコード スニペットは ISO 形式 (YYYY-MM-DD) の日付を受け入れ、DD.MM.YYYY 形式で表示します:

コードをコピーします コードは次のとおりです:

if (ereg ("([0-9]{4})-([0-9]{1,2})-([ 0-9]{1,2})" , $date, $regs)) {
echo "$regs[3].$regs[2].$regs[1]";
} else {
echo "無効です日付形式: $date";
}
? >

--------------------------------- -------------------------------------------------------- -
ereg_replace関数: (正規表現置換)

形式: string ereg_replace (文字列パターン、文字列置換、文字列文字列)
関数説明:
この関数は、文字列内のパターンに一致する部分をスキャンし、置換に置き換えます。
置換された文字列を返します。 (置換に一致するものが存在しない場合は、元の文字列が返されます。)
パターンに括弧内の部分文字列が含まれる場合、置換には \digit 形式の部分文字列が含まれる可能性があり、これらの部分文字列は最初の数個の部分文字列に置き換えられます。括弧; \0 には文字列の内容全体が含まれます。最大 9 つの部分文字列を使用できます。括弧は入れ子にすることができ、その場合は左括弧を使用して順序が計算されます。
文字列に一致するものが見つからない場合、文字列は変更されずに返されます。
この関数の例を見てみましょう:
1. 次のコード スニペットは、「This was a test」を 3 回出力します:
コードをコピーします コードは次のとおりです:

$string = "これはテストです";
echo str_replace(" は", "だった", $string);
echo ereg_replace("( )is", "\1was", $string); (( )is)" , "\2was", $string);
?>

注意すべき点は、置換パラメータに整数値を使用すると、期待した結果が得られない可能性があることです。これは、 ereg_replace() が数値を文字のシーケンス値として解釈して適用するためです。例:
2、置換パラメータが整数の場合の例:

コードをコピー コードは次のとおりです:
/* 期待した結果を生成できません*/
$num = 4;
$ string = "この文字列には 4 つの単語があります。";
$string = ereg_replace('four', $num, $string); /* 出力: 'この文字列には単語があります。'
/* この例は正常に動作します*/
$num = '4';
$string = "この文字列には 4 つの単語があります。"; string; /* 出力: 'この文字列には 4 つの単語があります。' */
?>


3、URL をハイパーリンクに置き換えます:


コードは次のとおりです:
$ text = ereg_replace("[[: alpha:]]+://[^<>[:space:]]+[[:alnum:]/]", "\0 ", $text);
ヒント: preg_replace() 関数は Perl 互換の正規表現構文を使用し、多くの場合 ereg_replace() のより高速な代替手段です。
正規表現と互換性のある Perl の 2 つの主な関数を見てみましょう:
preg_match 関数: (正規表現のマッチング)
形式: int preg_match (文字列パターン、文字列サブジェクト [、配列一致 [、int フラグ]])
機能の説明:
件名文字列のパターンで指定された正規表現に一致するコンテンツを検索します。
一致が提供された場合は、検索結果が入力されます。 $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() を使用できます。
その例を見てみましょう:
例 1. テキスト内で「php」を検索します:
コードをコピーします コードは次のとおりです:

//"i afterパターン区切り文字 " 大文字と小文字を区別しない検索を表します
if (preg_match ("/php/i", "PHP は選択した Web スクリプト言語です。")) {
print "一致が見つかりました。";
} else {
print "一致するものが見つかりませんでした。";
}
?> の b は単語の境界を表すため、独立した "web" 単語のみが一致します。
* ただし、"webbing" または "cobweb" の一部は一致しません。 */
if (preg_match ("/bwebb/i" , "PHP は最適な Web スクリプト言語です。")) {
print "一致するものが見つかりました。";
} else {
print "一致するものが見つかりませんでした。 ."; } if (preg_match ("/bwebb /i", "PHP は Web サイトのスクリプト言語です。")) { print "一致が見つかりました。"; } else {
print "一致見つかりませんでした。";
}
?>


例 3. URL からドメイン名を取得します:



コードをコピーします

コードは次のとおりです:


/ / URLからホスト名を取得
preg_match("/^(http://) ?([^/]+)/i",
"http://www.php.net/index.html", $ matches);
$host = $matches[2];
// ホスト名から次の 2 つの段落を取得します
preg_match("/[^./]+.[^./]+$/", $host, $matches); echo "ドメイン名: {$matches[0]}n"; この例は次のように出力します:
ドメイン名: php.net
----- ------------------------ ------------------------ ------------------------ ----
preg_replace関数:(正規表現による検索と置換を行う)
形式:mixed preg_replace(混合パターン、混合) replace,mixed subject [, 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 は単なるリテラルとして残ります。
その例を見てみましょう:
例 1. 逆参照の後に数字を使用する方法:


コードをコピーします

コードは次のとおりです:

$string = "2003 年 4 月 15 日";
$pattern = "/(w+) (d+), (d+)/i"; ;
print preg_replace($pattern, $replacement, $string);
/* 出力
======
April1,2003
?> 一致するものが見つかった場合は、それが返されます。置換された件名、そうでない場合は元の変更されていない件名が返されます。
preg_replace() のすべてのパラメータ (limit を除く) は配列にすることができます。 pattern と replace の両方が配列の場合、それらのキーは配列内に出現する順序で処理されます。これは、インデックスの番号順と必ずしも同じではありません。どのパターンをどの置換で置き換えるかを識別するためにインデックスを使用する場合、preg_replace() を呼び出す前に配列を ksort() でソートする必要があります。
例 2. preg_replace() でインデックス配列を使用する:


コードをコピー

コードは次のとおりです:
$string = "The Quick Brown Fox Jumped Over the Lazy Dog."; $パターン[0] = "/クイック/";
$パターン[1] = "/ブラウン/";
$replacements[2] = "クマ";
$replacements[1] = "黒";
$replacements[0] = "遅い";
print preg_replace($patterns, $replacements, $string);
/* 出力
======黒は怠惰な犬を飛び越えました
*/
/* パターンと置換を行うことで、
欲しいものを得ることができます。 */
ksort($patterns)
print preg_replace($patterns); , $ replaces, $string);
/* 出力
======
遅いツキノワグマは怠惰な犬を飛び越えました
*/
?>


subject が配列の場合、subject 内の各要素。項目の検索と置換を実行し、配列を返します。
patternとreplacementが両方とも配列の場合、preg_replace()はsubjectを検索して置換するためにそれらから値を取り出します。置換の値がパターンの値よりも少ない場合、空の文字列が残りの置換値として使用されます。 pattern が配列で、replacement が文字列である場合、この文字列は pattern の各値の置換値として使用されます。その逆は無意味です。
/e 修飾子により、 preg_replace() は置換引数を PHP コードとして処理します (適切な後方参照が置換された後)。ヒント: 置換によって有効な PHP コード文字列が形成されていることを確認してください。そうでない場合、PHP は preg_replace() を含む行で構文解析エラーを報告します。
例 3. いくつかの値を置き換えます:


コードをコピー

コードは次のとおりです:


$patterns = array ("/(19|20)(d{2})-( d{ 1,2})-(d{1,2})/", "/^s*{(w+)}s*=/"); $replace = array ("\3/\4/ \1 \2", "$\1 ="); print preg_replace ($patterns, $replace, "{startDate} = 1999-5-27"); ?>

この例では次のように出力されます:
$startDate = 5/27/1999
例 4. /e 修飾子を使用します:



コードをコピー

コードは次のとおりです:


preg_replace ("/(]*>)/e", "'\1'.strtoupper('\2').'\3'", $html_body); ?>
これ入力文字は文字列内のすべての HTML タグが大文字になります。
例 5. HTML をテキストに変換します:



コードをコピー
コードは次のとおりです:


// $document には HTML ドキュメントが含まれている必要があります。 // この例では、HTML タグ、JavaScript コード //、および空白文字を削除します。一部の一般的な // HTML エンティティも、対応するテキストに変換されます。 $search = array ("']*?>.*?'si", // JavaScript を削除します "'<[/!]*?[^< ;>]*?>'si", // HTML タグを削除します
"'([rn])[s]+'", // 空白文字を削除します
"'&(quot|#34);'i ", // HTML エンティティを置換します
"'&(amp|#38);'i",
"'&(lt|#60);'i",
"'&(gt|#62);'i ",
"'&(nbsp|#160);'i",
"'&(iexcl|#161);'i",
"'&(cent|#162);'i",
"' &(pound|#163);'i",
"'&(copy|#169);'i",
"'(d+);'e"); // PHP コードとして実行
$replace = 配列 ("",
"",
"\1",
""",
"&",
"<",
">",
" ",
chr(161),
chr (162),
chr(163),
"chr(\1)");
$text = preg_replace ($search, $replace, $document?>)
終わり…

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/322544.html技術記事まず、POSIX スタイルの正規表現の 2 つの主要な関数を見てみましょう: ereg 関数: (正規表現のマッチング) 形式: int ereg ( string pattern, string string [, array lt;?php if (...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。