preg_match_all :文字列内の正規表現に準拠し、すべてのマッチング結果を返すすべてのコンテンツを一致させるために使用されます。これは、すべてのターゲットコンテンツが最初に抽出され、次に処理されるシナリオに適しています。
preg_replace :文字列上の交換操作を直接実行するために使用され、すべてのマッチングコンテンツの交換をサポートします。
複雑な交換ロジックでは、最初にpreg_match_allを使用してすべてのターゲットコンテンツを抽出し、抽出結果を処理し、 preg_replaceを使用して置換できます。
複数のURLリンクを含むテキストがあり、これらのURLのドメイン名をgitbox.netに置き換える必要があるとしますが、URLのパスとパラメーターの部分は変更されません。以下は、特定の操作を説明する例です。
<?php
// 元のテキスト,倍数が含まれていますURL
$text = "Baiduをご覧ください:http://www.baidu.com/s?wd=php
Googleにアクセスしてください:https://www.google.com/search?q=php
このサイトにアクセスしてください:http://example.com/page?id=123";
// すべてを一致させますURL規則性,シンプルなマッチhttp(s)始まりURL
$pattern = '/https?:\/\/([a-zA-Z0-9\.-]+)(\/[^\s]*)?/';
// 使使用preg_match_allすべてのマッチングを抽出しますURL
preg_match_all($pattern, $text, $matches);
// $matches[0]それは完全な試合ですURL,$matches[1]ドメイン名です,$matches[2]パスとパラメーターです(オプション)
$urls = $matches[0];
foreach ($urls as $url) {
// 分析URL,分割契約、ドメイン名、パス
$parsed = parse_url($url);
// 新しいものを構築しますURL,替换ドメイン名为gitbox.net
$new_url = $parsed['scheme'] . '://' . 'gitbox.net';
if (isset($parsed['path'])) {
$new_url .= $parsed['path'];
}
if (isset($parsed['query'])) {
$new_url .= '?' . $parsed['query'];
}
// 使用preg_replaceオリジナルを交換しますURL新しいためURL,エスケープスラッシュがここにあることに注意してください
$escaped_url = preg_quote($url, '/');
$text = preg_replace('/' . $escaped_url . '/', $new_url, $text);
}
echo $text;
?>
最初にpreg_match_allを使用して、 http://またはhttps://で始まるすべてのURLを一致させ、それぞれドメイン名とパスをキャプチャします。
Parse_urlを介してURLを分解して、ドメイン名パーツの交換を容易にします。
ドメイン名をgitbox.netに置き換え、パスとパラメーターを保存します。
テキストの元のURLを、新しいURLにpreg_replaceで1つずつ置き換えます。
最初にpreg_match_allに置き換える必要があるすべてのターゲットコンテンツを抽出し、各コンテンツの論理的に処理し、 preg_replaceを使用してバッチ交換を完了することにより、交換の精度を保証するだけでなく、コードの維持可能性と柔軟性を向上させます。この方法は、特に交換ルールが単純な文字列置換以上のものである場合、複雑な文字列のバッチ処理に適しています。
この記事が、 preg_match_allとpreg_replaceを組み合わせるスキルを理解し、習得できることを願っています。