現在の位置: ホーム> 最新記事一覧> preg_replace正規表現構文:定期的な交換スキルをゼロから学ぶ

preg_replace正規表現構文:定期的な交換スキルをゼロから学ぶ

gitbox 2025-09-17

PHPでは、 preg_replace()は、テキストを処理するための最も便利な「スイスアーミーナイフ」です。これは、PCRE(Perl互換性のある正規表現)に基づいており、簡単な検索と交換を行うだけでなく、構造化された書き換え、データのクリーニング、バッチ名の変更などの完全な複雑なタスクもできます。この記事は、関数の署名、通常の構文、一般的なシナリオ、およびpreg_replace()のピットを回避する重要なポイントに焦点を合わせて、ゼロから開始され、通常の交換のコアスキルをすばやく習得するのに役立ちます。

1。preg_replace ()の基本的な使用

関数の署名:

 <span><span><span class="hljs-keyword">mixed</span></span><span> </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(
    </span><span><span class="hljs-keyword">string</span></span><span>|</span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$pattern</span></span><span>,
    </span><span><span class="hljs-keyword">string</span></span><span>|</span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$replacement</span></span><span>,
    </span><span><span class="hljs-keyword">string</span></span><span>|</span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$subject</span></span><span>,
    </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$limit</span></span><span> = -</span><span><span class="hljs-number">1</span></span><span>,
    </span><span><span class="hljs-keyword">int</span></span><span> &amp;</span><span><span class="hljs-variable">$count</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>
)
</span></span>
  • $パターン:正規表現(複数のルールを表す配列にすることができます)

  • $の交換:コンテンツを交換します(パターンに1つずつ対応する配列にすることができます)

  • $件名:保留中の文字列(または文字列の配列)

  • $制限:交換時間の上限(デフォルト-1は制限なし)

  • $ count :出力パラメーター、実際の交換数を返します

最小例:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$text</span></span><span> = </span><span><span class="hljs-string">"Color or Colour? I like the color blue."</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/colou?r/i'</span></span><span>, </span><span><span class="hljs-string">'color'</span></span><span>, </span><span><span class="hljs-variable">$text</span></span><span>, -</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-variable">$count</span></span><span>);

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>; </span><span><span class="hljs-comment">// Color or color? I like the color blue.</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> PHP_EOL . </span><span><span class="hljs-string">"Replaced: <span class="hljs-subst">$count</span></span></span><span>"; </span><span><span class="hljs-comment">// Replaced: 2</span></span><span>
</span></span>

/colou?r/i :?前のuをオプションにします。 Iモディファイアは、大文字と小文字を無視します。

2。セパレーターと修飾子

2.1デリミター

一般的な区切り文字には、 /#〜%{}()などが含まれます。最も心配のない選択は、パターンと競合しないセパレーターを選択することです。

 <span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'#https?://[^\s]+#'</span></span><span>, </span><span><span class="hljs-string">'[link]'</span></span><span>, </span><span><span class="hljs-variable">$text</span></span><span>);
</span></span>

多数の/モードがある場合、 を使用すると、多数のエスケープを回避できます。

2.2共通修飾子

  • I :ケースを無視します

  • M :マルチラインモード( ^$は各行の開始/終了と一致します)

  • S :シングルラインパターン( ニューラインも一致します)

  • U :UTF-8を押して処理します(中国/絵文字シナリオに強くお勧めします)

  • X :モードでブランクやコメントを無視する(読みやすさの方が良い)

  • U :怠zyな数量ファイヤー反転(デフォルトで貪欲から怠lazへの変化)

例(複数行 +単一行):

 <span><span><span class="hljs-variable">$log</span></span><span> = </span><span><span class="hljs-string">"ID:42\nPayload:\n{\n  \"a\":1\n}\nEnd"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/^Payload:(.*)End$/ims'</span></span><span>, </span><span><span class="hljs-string">'[DATA HIDDEN]'</span></span><span>, </span><span><span class="hljs-variable">$log</span></span><span>);
</span></span>

3。メタカラクターと数量詞からすぐに始めましょう

  • キャラクタークラス: [ABC][^ABC]\ d番号、 \ w word文字、 \ sブランク

  • 位置アンカー: ^行の始まり、 $ line end、 \ bワード境界

  • 数量詞: * (0+)、 + (1+) 、? (0/1)、 {m、n} (範囲)

  • 貪欲/怠zy: +貪欲、 +?怠lazです(できるだけ少ない一致)

例(メールボックスマスク):

 <span><span><span class="hljs-variable">$email</span></span><span> = </span><span><span class="hljs-string">'[email protected]'</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/(?&lt;=.).+?(?=@)/'</span></span><span>, </span><span><span class="hljs-string">'***'</span></span><span>, </span><span><span class="hljs-variable">$email</span></span><span>);
</span><span><span class="hljs-comment">// a***@example.com</span></span><span>
</span></span>

検索の前後(?<= ...)(?= ...)を使用して、不必要な文字をキャプチャしないように交換範囲を正確に見つけます。

4.グループ化と背景をキャプチャします

  • キャプチャグループ化(...)一致するコンテンツを1ドル、2ドル、... (交換用文字列で使用)

  • キャプチャされていないグループ化(?:...)グループ化のみが保存されず、パフォーマンスが向上します

例(名前のフォーマット: Zhang San-Li SiZhang San&Li Si ):

 <span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-string">'チャン・サン-li si'</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/^(\S+)\s*-\s*(\S+)$/u'</span></span><span>, </span><span><span class="hljs-string">'$1 &amp; $2'</span></span><span>, </span><span><span class="hljs-variable">$name</span></span><span>);
</span><span><span class="hljs-comment">// チャン・サン &amp; li si</span></span><span>
</span></span>

例(URL標準化: http://example.com/path→小文字ドメイン名):

 <span><span><span class="hljs-variable">$url</span></span><span> = </span><span><span class="hljs-string">'HTTP://EXAMPLE.COM/Path'</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/^(https?):\/\/([^\/]+)/ie'</span></span><span>, </span><span><span class="hljs-string">"'<span class="hljs-subst">$1</span></span></span><span>://'.strtolower('</span><span><span class="hljs-subst">$2</span></span><span>')", </span><span><span class="hljs-variable">$url</span></span><span>);
</span></span>

?? /eモディファイアは、古いコード(非推奨)に表示され、使用しない場合があります。代わりにコールバックを使用してください(次のセクションを参照)。

5.コールバックを使用して「スマート交換」を作成します: preg_replace_callback()

交換値を計算する必要がある場合(ケース変換、動的番号付け、条件付き判断など)、コールバックを使用する方が安全です。

 <span><span><span class="hljs-variable">$input</span></span><span> = </span><span><span class="hljs-string">"HTTP://EXAMPLE.COM/Path and http://MiXeD.com/Another"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace_callback</span></span><span>(
    </span><span><span class="hljs-string">'#\bhttps?://([^/\s]+)#i'</span></span><span>,
    function (</span><span><span class="hljs-variable">$m</span></span><span>) {
        </span><span><span class="hljs-comment">// $m[0] それはすべての試合です,$m[1] ドメイン名です</span></span><span>
        </span><span><span class="hljs-variable">$scheme</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stripos</span></span><span>(</span><span><span class="hljs-variable">$m</span></span><span>[</span><span><span class="hljs-number">0</span></span><span>], </span><span><span class="hljs-string">'https://'</span></span><span>) === </span><span><span class="hljs-number">0</span></span><span> ? </span><span><span class="hljs-string">'https://'</span></span><span> : </span><span><span class="hljs-string">'http://'</span></span><span>;
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$scheme</span></span><span> . </span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$m</span></span><span>[</span><span><span class="hljs-number">1</span></span><span>]);
    },
    </span><span><span class="hljs-variable">$input</span></span><span>
);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>;
</span><span><span class="hljs-comment">// http://example.com/Path and http://mixed.com/Another</span></span><span>
</span></span>

また、大量のデータを処理するのに適した姉妹関数があります。PREG_REPLACE_CALLBACK_ARRAY () 。複数のルールとコールバックを一度に登録できます。

 <span><span><span class="hljs-variable">$text</span></span><span> = </span><span><span class="hljs-string">"Price: 19.99 USD, Date: 2025-08-25"</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace_callback_array</span></span><span>([
    </span><span><span class="hljs-string">'/\b(\d+(?:\.\d{2})?)\s*USD\b/'</span></span><span> =&gt; fn(</span><span><span class="hljs-variable">$m</span></span><span>) =&gt; </span><span><span class="hljs-string">'$'</span></span><span> . </span><span><span class="hljs-variable">$m</span></span><span>[</span><span><span class="hljs-number">1</span></span><span>],
    </span><span><span class="hljs-string">'/\b(\d{4})-(\d{2})-(\d{2})\b/'</span></span><span>  =&gt; </span><span><span class="hljs-function"><span class="hljs-keyword">fn</span></span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$m</span></span></span><span>) =&gt; </span><span><span class="hljs-string">"<span class="hljs-subst">{$m[2]}</span></span></span><span>/</span><span><span class="hljs-subst">{$m[3]}</span></span><span>/</span><span><span class="hljs-subst">{$m[1]}</span></span><span>",
], </span><span><span class="hljs-variable">$text</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$result</span></span><span>; </span><span><span class="hljs-comment">// Price: $19.99, Date: 08/25/2025</span></span><span>
</span></span>

6.マルチルールバッチ交換

$パターン$の交換サポートアレイの両方。交換値が1つずつ対応しない場合、同じ交換値が各モードに適用されます。

 <span><span><span class="hljs-variable">$input</span></span><span> = </span><span><span class="hljs-string">"foo 123 bar 456 baz"</span></span><span>;
</span><span><span class="hljs-variable">$patterns</span></span><span> = [</span><span><span class="hljs-string">'/\bfoo\b/'</span></span><span>, </span><span><span class="hljs-string">'/\d+/'</span></span><span>, </span><span><span class="hljs-string">'/\bbaz\b/'</span></span><span>];
</span><span><span class="hljs-variable">$replacements</span></span><span> = [</span><span><span class="hljs-string">'FOO'</span></span><span>, </span><span><span class="hljs-string">'[NUM]'</span></span><span>, </span><span><span class="hljs-string">'BAZ'</span></span><span>];
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-variable">$patterns</span></span><span>, </span><span><span class="hljs-variable">$replacements</span></span><span>, </span><span><span class="hljs-variable">$input</span></span><span>);
</span><span><span class="hljs-comment">// FOO [NUM] bar [NUM] BAZ</span></span><span>
</span></span>

7。ユニコード/中国と境界の問題

マルチバイト文字の壊れないように、デフォルトでU修飾子を追加することをお勧めします。

  • 中国の分詞境界は利用可能ですか\ b ?信頼できない。 \ bは「単語境界」であり、ASCIIワード文字を目的としています。中国の境界を扱うときは、透明な文字クラスまたは検索の前後を使用してください。

例(中国語と数字の間にスペースを追加):

 <span><span><span class="hljs-variable">$str</span></span><span> = </span><span><span class="hljs-string">"バージョン2投稿されました2025年8月25日"</span></span><span>;
</span><span><span class="hljs-variable">$str</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/(?&lt;=[\x{4e00}-\x{9fa5}])(?=\d)/u'</span></span><span>, </span><span><span class="hljs-string">' '</span></span><span>, </span><span><span class="hljs-variable">$str</span></span><span>);
</span><span><span class="hljs-variable">$str</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/(?&lt;=\d)(?=[\x{4e00}-\x{9fa5}])/u'</span></span><span>, </span><span><span class="hljs-string">' '</span></span><span>, </span><span><span class="hljs-variable">$str</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$str</span></span><span>; </span><span><span class="hljs-comment">// バージョン 2 投稿されました 2025 年 8 月 25 日</span></span><span>
</span></span>

\ x {4e00} - \ x {9fa5}は、一般的に使用される漢字間隔です。u追加することを忘れないでください。

8。一般的な交換シナリオでの実際の戦闘

8.1 HTMLクリーニング(「解析html」というハンマーを書かないように注意してください)

目標:すべてのタグを削除し、単純なテキストのみを保持します。

 <span><span><span class="hljs-variable">$html</span></span><span> = </span><span><span class="hljs-string">"&lt;p&gt;Hello &lt;strong&gt;world&lt;/strong&gt; &amp;copy; 2025&lt;/p&gt;"</span></span><span>;
</span><span><span class="hljs-variable">$plain</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/&lt;[^&gt;]+&gt;/'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>, </span><span><span class="hljs-variable">$html</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$plain</span></span><span>; </span><span><span class="hljs-comment">// Hello world ? 2025</span></span><span>
</span></span>

シンプルなクリーニングは大丈夫です。 DOMを使用して、複雑なHTML構造を堅牢にしてください。

8.2電話/カード番号脱感作

<span><span><span class="hljs-variable">$phone</span></span><span> = </span><span><span class="hljs-string">"13812345678"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/(\d{3})\d{4}(\d{4})/'</span></span><span>, </span><span><span class="hljs-string">'$1****$2'</span></span><span>, </span><span><span class="hljs-variable">$phone</span></span><span>);
</span><span><span class="hljs-comment">// 138****5678</span></span><span>
</span></span>

8.3バッチ変数プレースホルダー交換(ブレース構文)

 <span><span><span class="hljs-variable">$template</span></span><span> = </span><span><span class="hljs-string">"Hi {name}, your order {id} is {status}."</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = [</span><span><span class="hljs-string">'name'</span></span><span> =&gt; </span><span><span class="hljs-string">'Alice'</span></span><span>, </span><span><span class="hljs-string">'id'</span></span><span> =&gt; </span><span><span class="hljs-number">42</span></span><span>, </span><span><span class="hljs-string">'status'</span></span><span> =&gt; </span><span><span class="hljs-string">'shipped'</span></span><span>];

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">preg_replace_callback</span></span><span>(</span><span><span class="hljs-string">'/\{(\w+)\}/'</span></span><span>, function(</span><span><span class="hljs-variable">$m</span></span><span>) </span><span><span class="hljs-keyword">use</span></span><span> ($</span><span><span class="hljs-title">data</span></span><span>) {
    </span><span><span class="hljs-title">return</span></span><span> $</span><span><span class="hljs-title">data</span></span><span>[$</span><span><span class="hljs-title">m</span></span><span>[1]] ?? $</span><span><span class="hljs-title">m</span></span><span>[0];
}, </span><span><span class="hljs-variable">$template</span></span><span>);
</span><span><span class="hljs-comment">// Hi Alice, your order 42 is shipped.</span></span><span>
</span></span>

8.4 HTML <IMG>へのマークダウン画像

<span><span><span class="hljs-variable">$md</span></span><span> = </span><span><span class="hljs-string">'![alt text](/img/logo.png "Title")'</span></span><span>;
</span><span><span class="hljs-variable">$img</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(
    </span><span><span class="hljs-string">'/!\[([^\]]*)\]\((\S+)(?:\s+"([^"]*)")?\)/'</span></span><span>,
    </span><span><span class="hljs-string">'&lt;img src="$2" alt="$1" title="$3"&gt;'</span></span><span>,
    </span><span><span class="hljs-variable">$md</span></span><span>
);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$img</span></span><span>;
</span><span><span class="hljs-comment">// &lt;img src="/img/logo.png" alt="alt text" title="Title"&gt;</span></span><span>
</span></span>

8.5標準化されたブランクと句読点

<span><span><span class="hljs-variable">$text</span></span><span> = </span><span><span class="hljs-string">"Hello,world!   PHP\tis\ngreat."</span></span><span>;
</span><span><span class="hljs-comment">// 1つのスペースに壊れていない連続した白いスペースを圧縮する</span></span><span>
</span><span><span class="hljs-variable">$text</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/[^\S\r\n]+/'</span></span><span>, </span><span><span class="hljs-string">' '</span></span><span>, </span><span><span class="hljs-variable">$text</span></span><span>);
</span><span><span class="hljs-comment">// 中国のコンマを英語のコンマに交換し、スペースを追加します</span></span><span>
</span><span><span class="hljs-variable">$text</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/,/u'</span></span><span>, </span><span><span class="hljs-string">', '</span></span><span>, </span><span><span class="hljs-variable">$text</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$text</span></span><span>; </span><span><span class="hljs-comment">// Hello, world! PHP is great.</span></span><span>
</span></span>

8.6抽出と再編成(ログフィールド再配置)

 <span><span><span class="hljs-variable">$line</span></span><span> = </span><span><span class="hljs-string">'2025-08-25 14:03:22 [INFO] user=alice ip=203.0.113.9'</span></span><span>;
</span><span><span class="hljs-variable">$fmt</span></span><span>  = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(
    </span><span><span class="hljs-string">'/^(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2}) \[(\w+)\] user=(\w+) ip=([\d.]+)$/'</span></span><span>,
    </span><span><span class="hljs-string">'[$3][$1T$2Z] $4@$5'</span></span><span>,
    </span><span><span class="hljs-variable">$line</span></span><span>
);
</span><span><span class="hljs-comment">// [INFO][2025-08-25T14:03:22Z] [email protected]</span></span><span>
</span></span>

9。パフォーマンスと信頼性の推奨事項

  1. 優先順位は具体的であり、世紀後のものです。キャラクタークラスは、避けるために可能な限り狭くなければなりません。*乱用。必要に応じて、怠zyな数量詞を使用するか、前後に検索してください。

  2. 壊滅的なバックトラッキングを避けてください:モードの(。+)+(。*){m、}などの構造は非常に爆発的です。境界を明確にできる場合は、「ヘビ」を使用しないでください。

  3. Uモディファイアを使用:テキストにマルチバイト文字(中国/絵文字)が含まれている場合、追加する必要があります。そうしないと、文字が破壊される場合があります。

  4. /eの代わりにコールバック:計算する必要がある交換は、 preg_replace_callback()で使用されます。

  5. コントロール$制限:最初の試合を交換するだけの場合は、 $ lime1に設定します。

  6. 統計とテスト$ countを使用して、交換数を収集します。境界ユースケースをカバーする重要なパターンのユニットテストを記述します。

  7. Precompilation/Cache :PHPには、内部的にPCREの特定のキャッシュがあります。ただし、高周波パスでは、ループ内の可変モードの構築を避けるようにしてください。

10。エラーの修正とデバッグ

  • 複製の最小化:ロングモードを分解し、セグメントごとにセグメントを確認します。

  • 読みやすさXモディファイアを使用して、「注釈付き」パターンを記述します。

 <span><span><span class="hljs-variable">$pattern</span></span><span> = <span class="hljs-string">'/
    ^\s*              # 最初は許可されています
    (?P&lt;key&gt;\w+)      # 鍵
    \s*=\s*
    (?P&lt;val&gt;.+?)      # 価値(不活性)
    \s*$
/x'</span>;
</span></span>
  • 脱出の認識:PHP文字列では、脱出は2回検討する必要があります(たとえば、 「\ d」\\ dの違い)。

11。一般的に使用される「剣」のリスト

  • 最初の一致のみを交換しますpreg_replace($ p、$ r、$ s、1、$ count);

  • スクリプトタグを安全に削除するpreg_replace( '#<script \ b [^>]*>。*?</script> #is'、 ''、$ html);

  • URLのクエリパラメーターを変更しました:match ([?&])old =([^&#]*)$ 1new = $ 2

  • 1000分の値(シンプルな値)にコンマを挿入preg_replace( '/\ b(?=(\ d {3})+(?!\ d))/'、 '、'、$ n);

  • 過剰な空白行圧縮preg_replace( '/(\ r)\ s*(\ r)/'、 "$ 1 $ 2"、$ text);

  • 目に見えない文字を削除preg_replace( '/[\ x00- \ x1f \ x7f]/'、 ''、$ s);

  • Humpは下線になりますpreg_replace( '/(?<!^)[az]/'、 '_ $ 0'、$ camel);

12。包括的な例:ログ脱感作 +構造化出力

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$log</span></span><span> = <span class="hljs-string">&lt;&lt;&lt;LOG
[2025-08-25 10:00:01] user=john phone=13812345678 [email protected]
[2025-08-25 10:05:09] user=森 phone=13987654321 [email protected]
LOG</span>;

</span><span><span class="hljs-comment">// 1) 基本的な脱感作:携帯電話番号の真ん中にある4人が星を演じることができます、電子メールのユーザー名の最初の文字のみ</span></span><span>
</span><span><span class="hljs-variable">$log</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/(\b1\d{2})\d{4}(\d{4}\b)/'</span></span><span>, </span><span><span class="hljs-string">'$1****$2'</span></span><span>, </span><span><span class="hljs-variable">$log</span></span><span>);
</span><span><span class="hljs-variable">$log</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(</span><span><span class="hljs-string">'/(?&lt;=\b)[A-Za-z0-9._%+-](?:[A-Za-z0-9._%+-]?)+(?=@)/'</span></span><span>, </span><span><span class="hljs-string">'*'</span></span><span>, </span><span><span class="hljs-variable">$log</span></span><span>);

</span><span><span class="hljs-comment">// 2) 構造化された書き換え:に変換します CSV わかりました</span></span><span>
</span><span><span class="hljs-variable">$csv</span></span><span> = </span><span><span class="hljs-title function_ invoke__">preg_replace</span></span><span>(
    </span><span><span class="hljs-string">'/^\[(\d{4}-\d{2}-\d{2}) (\d{2}:\d{2}:\d{2})\]\s+user=([^\s]+)\s+phone=([^\s]+)\s+email=([^\s]+)$/mu'</span></span><span>,
    </span><span><span class="hljs-string">'$1,$2,$3,$4,$5'</span></span><span>,
    </span><span><span class="hljs-variable">$log</span></span><span>
);

</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$csv</span></span><span>;
<span class="hljs-comment">/*
2025-08-25,10:00:01,john,138****5678,j*</span></span><span><span class="hljs-doctag">@example</span></span><span>.com
2025-08-25,10:05:09,森,139****4321,l*</span><span><span class="hljs-doctag">@example</span></span><span>.cn
*/
</span></span>

結論

preg_replace()の力は、「探しているパターンを正確に説明し、それを書き直す必要があるものに書き直す」にあります。セパレーターと修飾子を把握し、グループ化とフロントバック検索のキャプチャを適切に利用し、コンピューティングが必要なときにコールバックを使用することにより、クリーニングから毎日の開発での書き換えまで、さまざまなテキストタスクを簡単に完了できます。より小さな例を書き、より多くの境界テストを行うと、規則性は「ブラックマジック」から便利な毎日のツールに変わります。