ホームページ >バックエンド開発 >PHPチュートリアル >PHP preg_replace() の通常の置換文字列_PHP チュートリアル

PHP preg_replace() の通常の置換文字列_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:39:081455ブラウズ

プログラムによって処理されるデータは、必ずしもデータベースの考え方に基づいて事前に設計されているとは限らず、データベースの構造を使用して保存することもできません。
たとえば、テンプレート エンジンの解析テンプレート、スパム機密情報のフィルタリングなど。
通常、この場合、ルールに従って正規表現を使用して preg_match を照合し、 preg_replace を置き換えます。
しかし、一般的なアプリケーションでは、それらはデータベースの CRUD にすぎず、正規表現をいじる機会はほとんどありません。
前述の説明によれば、2 つのシナリオがあります。マッチングを使用した統計分析と、置換を使用した処理です。

PHP preg_replace() の通常の置換は、JavaScript の通常の置換とは異なり、PHP preg_replace() のデフォルトでは、シンボルが条件に一致するすべての要素を置換します。
preg_replace (正規表現、置換後の文字列、最大置換数 [デフォルト -1、無数]、置換回数)

ほとんどの言語の正規表現は似ていますが、微妙な違いもあります。

PHP 正規表現

通常の文字 通常の説明
次の文字を特殊文字、リテラル文字、後方参照、または 8 進エスケープ文字としてマークします。たとえば、「n」は文字「n」と一致します。 「\n」は改行文字と一致します。シーケンス "\" は "" に一致し、"(" は "(" に一致します。
^ は入力文字列の先頭に一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、^ は "n" または "r の後の位置にも一致します。 ".
$ は入力文字列の末尾に一致します。 RegExp オブジェクトの Multiline プロパティが設定されている場合、$ は "n" または "r" の前の位置にも一致します。
* は直前の部分式に 0 回以上一致します。 *Can 「z」と「zoo」に一致します。 * {0,} と同等です。たとえば、「zo+」は「zo」に一致しますが、「z」には一致しません。 + {1,} と同等。たとえば、「do(es)?」は、「does」の「do」と一致します。たとえば、「o{2}」は「food」の「o」と一致しません。たとえば、「o{2,}」は「Bob」の「o」と一致しません。「o{1,}」は「o+」と同等です。 0,}" は "o*" と同等です。
{n,m} m と n は両方とも非負の整数であり、n? の間にスペースを入れることはできないことに注意してください ( *、+、?、{n}、{n,}、{ n,m})、一致モードは非貪欲モードですが、非貪欲モードは検索文字列の可能な限り少ない部分と一致しますが、デフォルトの貪欲モードは一致します。たとえば、文字列「oooo」の場合、「o?」はすべての「o」に一致します。 "n" を含む単一の文字。任意の文字。"[sS]" のようなパターンを使用してください。
(パターン) は、VBScript の SubMatches コレクションを使用して、生成された Matches コレクションから取得できます。 $0 ~ $9 属性。括弧を一致させるには、「(」または「)」を使用します。
(?:pattern) はパターンに一致しますが、一致結果は取得されません。つまり、非フェッチ一致であり、保存されません。これは、または文字「(|)」を使用してパターンの一部を結合する場合に便利です。たとえば、「industr(?:y|ies)」は「industry|industries」よりも短い式です。
(?=pattern) 正の正の検索。文字列一致パターンの先頭にある検索文字列と一致します。これは非フェッチ一致です。つまり、後で使用するために一致をフェッチする必要はありません。たとえば、「Windows(?=95|98|NT|2000)」は、「Windows2000」の「Windows」と一致しますが、「Windows3.1」の「Windows」と一致することはできません。プリフェッチでは文字は消費されません。つまり、一致が発生した後、次の一致の検索は、プリフェッチを含む文字の後に開始されるのではなく、最後の一致の直後に開始されます。
(?!pattern) 前方否定検索。パターンに一致しない文字列の先頭にある検索文字列と一致します。これは非フェッチ一致です。つまり、後で使用するために一致をフェッチする必要はありません。たとえば、「Windows(?!95|98|NT|2000)」は、「Windows3.1」の「Windows」と一致しますが、「Windows2000」の「Windows」と一致することはできません。
(?<=pattern) リバース ポジティブ プリチェックはフォワード ポジティブ プリチェックと似ていますが、方向が逆です。たとえば、「(?<=95|98|NT|2000)Windows」は、「2000Windows」の「Windows」と一致しますが、「3.1Windows」の「Windows」と一致することはできません。
(?x|y は x または y と一致します。たとえば、「z|food」は「z」または「food」と一致します。 「(z|f)ood」は「zood」または「food」と一致します。
[xyz] 文字セット。含まれている文字のいずれかと一致します。たとえば、「[abc]」は「plain」の「a」と一致します。
[^xyz] 負の値の文字セット。含まれていない任意の文字と一致します。たとえば、「[^abc]」は「plain」の「plin」と一致します。
[a-z] 文字範囲。指定された範囲内の任意の文字と一致します。たとえば、「[a-z]」は、「a」から「z」までの範囲内の任意の小文字のアルファベット文字に一致します。注: ハイフンが文字グループ内にあり、2 つの文字の間にある場合のみ、文字の範囲を表すことができます。文字グループの先頭にある場合は、ハイフン自体を表すことができます。
[^a-z] 否定文字。範囲 。指定された範囲内にない任意の文字と一致します。たとえば、「[^a-z]」は、「a」から「z」の範囲にない任意の文字に一致します。
b は、単語とスペースの間の位置である単語境界に一致します。たとえば、「erb」は「never」の「er」と一致しますが、「verb」の「er」とは一致しません。
B は単語以外の境界に一致します。 「erB」は「動詞」の「er」と一致しますが、「never」の「er」とは一致しません。
cx は、x で指定された制御文字と一致します。たとえば、cM は Control-M または復帰文字と一致します。 x の値は、A ~ Z または a ~ z のいずれかでなければなりません。それ以外の場合は、c をリテラルの「c」文字として扱います。
d は数字と一致します。 [0-9]に相当します。
D は数字以外の文字と一致します。 [^0-9] と同等。
f はフォーム フィード文字と一致します。 x0c および cL に相当します。
n は改行文字と一致します。 x0a および cJ に相当します。
r は復帰文字と一致します。 x0d および cM に相当します。
s は、スペース、タブ、フォーム フィードなどを含む任意の空白文字と一致します。 【fnrtv】に相当。
S は空白以外の文字に一致します。 [^ fnrtv] に相当します。
タブ文字と一致しません。 x09 および cI に相当します。
v は垂直タブ文字と一致します。 x0b および cK に相当します。
w は、アンダースコアを含む任意の単語文字に一致します。 「[A-Za-z0-9_]」に相当します。
W は単語以外の文字に一致します。 「[^A-Za-z0-9_]」と同等。
xn は n と一致します。n は 16 進数のエスケープ値です。 16 進数のエスケープ値は、正確に 2 桁の長さである必要があります。たとえば、「x41」は「A」と一致します。 「x041」は「x04&1」と同等です。 ASCII エンコーディングは正規表現で使用できます。
num は num と一致します。ここで、num は正の整数です。取得した一致への参照。たとえば、「(.)1」は、連続する 2 つの同一の文字と一致します。
n は、8 進エスケープ値または後方参照を識別します。 n の前に少なくとも n 個のフェッチされた部分式がある場合、n は後方参照になります。それ以外の場合、n が 8 進数 (0 ~ 7) の場合、n は 8 進数のエスケープ値になります。
nm は、8 進エスケープ値または後方参照を識別します。 nm の前に少なくとも nm get 部分式がある場合、nm は後方参照になります。 nm の前に少なくとも n が取得されている場合、n は後方参照であり、その後にリテラル m が続きます。前述の条件がいずれも満たされず、n と m が両方とも 8 進数 (0 ~ 7) である場合、nm は 8 進数のエスケープ値 nm と一致します。
nml n が 8 進数 (0 ~ 7)、m と l が両方とも 8 進数 (0 ~ 7) の場合、8 進数のエスケープ値 nml と一致します。
un は n と一致します。n は 4 桁の 16 進数で表される Unicode 文字です。たとえば、u00A9 は著作権記号 (©) に一致します。

上記の表は正規表現を比較的包括的に説明したものであり、商標内の正規文字は特別な意味を持ち、元の文字の意味を表すものではなくなります。たとえば、正規表現の「+」はプラス記号を表しませんが、1 回以上の一致を表します。また、「+」でプラス記号を表したい場合は、その前に「」を付けてエスケープする必要があります。つまり、プラス記号を表すには「+」を使用します。
1+1=2 正規表現は次のとおりです: 1+1=2
そして正規表現 1+1=2 は複数の 1=2 を表すことができます。つまり:
11=2 正規表現: 1+1=2
111 =2 正規表現: 1+1=2
1111=2 正規表現: 1+1=2
...
つまり、すべての正規文字は特定の意味を持ち、元の文字の意味を表現するために使用できます。必要に応じて、前に「"」を追加してエスケープする必要があります。非正規文字であっても、「"」を使用してエスケープすることは問題ありません。
1+1=2 正規表現は次のようにすることもできます: 1+1=2
すべての文字をエスケープしますが、これはお勧めしません。
正規表現は区切り文字で囲む必要があります。JavaScript では区切り文字は「/」ですが、PHP では区切り文字として「/」を使用するのが一般的であり、区切り文字として「#」を使用することもできます。引用符で囲んでください。
正規表現にこれらの区切り文字が含まれている場合は、これらの文字をエスケープする必要があります。

PHP 正規表現区切り文字
ほとんどの言語の正規表現は「/」で区切られますが、PHP では、文字列に「/」「」文字が多く含まれる場合、「」を使用する場合に区切りに「#」を使用することもできます。 /" で区切る場合、これらの "/" をエスケープする必要がありますが、"#" を使用するとエスケープする必要がなく、より簡潔になります。
$weigeti='W3CSchool オンライン チュートリアルの URL は http://e.jbxue.com/ です。この URL を正しい URL に置き換えてもらえますか? ';
// 上記の要件は、 http://e.jbxue.com/ を http://e.jbxue.com/w3c/ に置き換えることです
// : - すべて通常のシンボルであるため、次のようにする必要があります。 / は区切り文字です。文字列に / 区切り文字が含まれている場合は、それをエスケープする必要があります
echo preg_replace('/http://www.jbxue.com//','http://e.jbxue.com) /w3c/',$weigeti);
// # が区切り文字として使用される場合、/ は区切り文字の意味を持たなくなるため、エスケープする必要はありません。
echo preg_replace('#http://www.jbxue.com/#','http://e.jbxue.com/w3c/',$weigeti);
//上記の 2 つの出力結果は同じです。 [ W3CSchool オンライン チュートリアルの URL は http://e.jbxue.com/w3c/ です。この URL を正しい URL に置き換えてもらえますか? 】
?>
上記 2 つの PHP 正規置換コードを通じて、正規ステートメントに多数の「/」が含まれる場合、区切り文字として「/」または「#」を使用しても問題ないことがわかりますが、 「#」を使用すると、コードがより簡潔に見えます。ただし、E-Dimension Technology では、JavaScript などの言語では区切り文字として「/」しか使用できないため、区切り文字として「/」を使用し続けることを推奨しています。他の言語。
PHP 正規表現修飾子

修飾子は、PHP 正規表現区切り文字「/」の末尾と正規表現の末尾の引用符の前に配置されます。
i 大文字と小文字を無視し、マッチングは大文字と小文字を考慮しません。
m 複数行の独立したマッチング。文字列に [n] やその他の改行が含まれていない場合、通常の正規表現と同じです。
s 通常の記号を設定します。改行文字 [n] と一致します。設定されていない場合、通常の記号は改行文字 n と一致しません。
x エスケープされていないスペースを無視します。
e eval() 一致した要素に対して関数を実行します。
前方アンカー、制約一致はターゲット文字列からのみ検索を開始します
D は $ を末尾としてロックします。D がない場合、文字列に [n] などの改行文字が含まれている場合でも、$ は改行文字と一致します。修飾子 m が設定されている場合、修飾子 D は無視されます。
S アンカーされていない一致を分析します
U 貪欲ではありません。通常の文字量指定子の後に「?」を追加すると、貪欲を復元できます
X Perl と互換性のない添付ファイルを開きます
u 文字列を強制的に UTF-8 でエンコードしますこれは、非 UTF-8 でエンコードされたドキュメントの場合にのみ必要です。 E-Dimensional Technology の調査によると、これを使用するとバグが発生する可能性があるため、UTF-8 環境では使用しないことをお勧めします。このバグの URL:
Javascript 正規表現に精通している場合は、条件を満たすすべての要素と一致することを意味する Javascript 正規表現の修飾子「g」に精通しているかもしれません。 PHPの通常置換では、すべてのシンボル条件に一致する要素となるため、Javascript修飾子「g」はありません。

PHP の通常の中国語と大文字小文字を無視する PHP preg_replace() は大文字と小文字を区別し、ASCII エンコーディングの文字列とのみ一致します。大文字と小文字を区別しない中国語文字を一致させる必要がある場合は、対応する修飾子 i または u を追加する必要があります。
$weigeti='W3CSchool オンライン チュートリアル URL: http://www.jbxue.com/w3school/';
echo preg_replace('/W3CSchool/','w3c',$weigeti);
//大文字と小文字が異なる場合は、[w3c オンライン チュートリアル Web サイト: http://www.jbxue.com/w3school/]
echo preg_replace('/W3CSchool/i','w3c',$weigeti);
//大文字と小文字を無視して出力します。 、置換出力を実行 [w3c オンライン チュートリアル URL: http://e.jbxue.com/w3c/]
echo preg_replace('/URL/u','',$weigeti);
//Force UTF-8 Chinese,置換して出力します [W3CSchool オンライン チュートリアル: http://www.jbxue.com/w3school/]
?>
PHP では大文字と中国語の両方が区別されますが、通常の Javascript では大文字と小文字のみが区別され、大文字と小文字は無視されます。は修飾子 i によっても影響されますが、JavaScript はそれが UTF-8 中国語などの特殊文字であるかどうかを判断する必要がなく、中国語と直接一致させることができます。

PHP の通常の改行文字の例
PHP の正規表現は、改行文字が見つかったときに、文字列の途中で改行文字を通常の文字として扱います。一般的な記号 . は n に一致しないため、改行文字を含む文字列に遭遇した場合には多くのポイントがあります。

$weigeti="jbxue.comnISnLOVINGnYOU";
// 上記の $weigeti を jbxue.com
echo preg_replace('/^[A-Z].*[A-Z]$/','') に置き換えたい,$weigeti);
// この正規表現は、w を含む要素のみに一致します。$weigeti は、[A-Z] と一致する V で始まり、[A-Z] と一致する U で終わります。 .Unable to match n
// 出力 [jbxue.com IS LOVEING YOU]
echo preg_replace('/^[A-Z].*[A-Z]$/s','',$weigeti);
// これは修飾子を使用しますs、つまり、n と一致するため、文全体が一致し、出力は空になります
// Output []
echo preg_replace('/^[A-Z].*[A-Z]$/m','',$weigeti );
// ここでは、n を複数の行として個別に照合するために修飾子が使用されています。これは次と同等です:
/*
$preg_m=preg_replace('/^[A-Z].*[A-Z]$/m','',$weigeti);
$p='/^[A-Z].* [ A-Z]$/';
$a=preg_replace($p,'','jbxue.com');
$b=preg_replace($p,'','IS');
$c=preg_replace($ p ,'','LOVING');
$d=preg_replace($p,'','YOU');
$preg_m === $a.$b.$c.$d;
*/
/ /出力【jbxue.com】
?>

今後、PHPを使ってWebサイトのコンテンツをクロールして正規表現に一括置換する場合、取得したコンテンツに改行が含まれていることを無視することになるため、正規表現置換を使用する際には注意が必要です。
PHP 正規マッチング実行関数 PHP 正規置換では、eval() を表す修飾子 e を使用して、一致したコンテンツに対して関数を実行できます。
$weigeti='W3CSchool オンライン チュートリアル Web サイト: http://www.jbxue.com、あなたは Jbzj ですか! ';
// 上記の URL を小文字に変換します
echo preg_replace('/(http:[/w.-]+/)/e','strto lower("$1")',$weigeti);
// を使用します修飾子 e の後に、一致する URL で PHP 関数 strto lower() を実行できます
// 出力 [W3CSchool オンライン チュートリアル URL: http://www.jbxue.com、あなたは Jbzj! 】
?>
上記のコードによると、一致した関数 strto lower() は引用符で囲まれていますが、それでも eval() によって実行されます。

通常の置換一致変数の後方参照
Javascript に精通している場合は、$1 $2 $3... などの後方参照に精通しているはずです。PHP では、これらは後方参照パラメータとしても使用できます。 PHP では、1 \1 を使用して後方参照を表すこともできます。
後方参照の概念は、大きなフラグメントを照合することです。この正規表現は内部的に括弧を使用していくつかの小さな一致要素に分割され、その後、括弧の順序に従って各一致要素が後方参照に置き換えられます。
$weigeti='W3CSchool オンライン チュートリアル Web サイト: http://www.jbxue.com、あなたは Jbzj ですか! ';
echo preg_replace('/.+(http:[w-/.]+/)[^w-!]+([w-!]+).+/','$1',$weigeti);
echo preg_replace('/.+(http:[w-/.]+/)[^w-!]+([w-!]+).+/','1',$weigeti);
echo preg_replace('/.+(http:[w-/.]+/)[^w-!]+([w-!]+).+/','\1',$weigeti);
//上の 3 つは出力 [http://www.jbxue.com]
echo preg_replace('/^(.+) URL: (http:[w-/.]+/)[^w-!]+( [ w-!]+).+$/','列: $1
ウェブサイト: $2
商標: $3',$weigeti);
/*
列: W3CSchool オンライン チュートリアル
ウェブサイト: http : //www.jbxue.com
商標: Jbzj!
*/
// 括弧内の括弧、外側の括弧が最初に数えられます
echo preg_replace('/^((.+) URL: (http:[w- /.] +/)[^w-!]+([w-!]+).+)$/','原文: $1
コラム: $2
ウェブサイト: $3/*
原文: W3CSchool オンライン チュートリアル Web サイト: http://www.jbxue.com、あなたは Jbzj ですか!
コラム: W3CSchool オンラインチュートリアル
ウェブサイト: http://www.jbxue.com
商標: Jbzj!
*/

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/733108.html技術記事プログラムで処理されるデータは、必ずしもデータベースの考え方で事前に設計されているとは限りません。あるいは、データベースの構造を使用して保存できるわけでもありません。 たとえば、テンプレート エンジンによるテンプレートの解析、スパムの機密情報のフィルタリングなど...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。