PHPプログラミングでは、多くの場合、文字列で複雑なマッチングおよび交換操作を実行する必要があります。 preg_match_allおよびpreg_replace_callback_arrayは、特に複雑なパターンのマッチングと置換を扱う場合に、この機能を実装するのに役立つ2つの非常に便利な機能です。この記事では、これら2つの機能を組み合わせて使用する方法と、それらを介して抽出と交換のタスクを実装する方法を詳細に紹介します。
preg_match_allは、グローバルな正規表現マッチングを実行するためにPHPで使用される関数です。文字列をスキャンし、正規表現に一致するすべての一致を返します。この関数によって返される結果は、通常、すべての一致する文字列を含む多次元配列です。
$pattern = '/\bhttps?:\/\/[a-zA-Z0-9-]+\.[a-zA-Z0-9-]+\b/';
$string = "Visit https://example.com or http://test.com for more information.";
preg_match_all($pattern, $string, $matches);
print_r($matches);
上記のコードは、文字列内のすべてのURLと一致します。
preg_replace_callback_arrayは、複数の正規表現を一致させ、各正規表現の異なるコールバック関数を指定できる強力な関数です。これにより、柔軟な文字列交換が可能になります。
$patterns = [
'/\d+/' => function($matches) {
return $matches[0] * 2; // 数を掛けます2
},
'/[a-zA-Z]+/' => function($matches) {
return strtoupper($matches[0]); // 手紙を首都に変換します
}
];
$string = "The quick 3 brown 5 foxes";
echo preg_replace_callback_array($patterns, $string);
このコードは、文字列の数値を掛け、文字を大文字に変換します。
実際のアプリケーションでは、最初に特定のコンテンツを抽出し、必要に応じてそれらを交換する必要があることがよくあります。この関数は、 preg_match_allとpreg_replace_callback_arrayを組み合わせて簡単に実装できます。
すべてのURLを1つのテキストから抽出し、それらのURLのドメイン名をM66.netに置き換える必要があるとします。
まず、 preg_match_allを使用してすべてのURLを抽出できます。
$pattern = '/https?:\/\/([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+)/';
$string = "Check out https://example.com and http://test.com for more information.";
preg_match_all($pattern, $string, $matches);
print_r($matches);
このコードは、すべてのURLドメイン名パーツ( Example.comおよびtest.com )を抽出します。
次に、 preg_replace_callback_arrayを使用して、抽出されたドメイン名パーツを置き換えます。コールバック関数のドメイン名をM66.netに置き換えることができます。
$patterns = [
'/https?:\/\/([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+)/' => function($matches) {
// 置き換えます m66.net ドメイン名
return str_replace($matches[1], 'm66.net', $matches[0]);
}
];
$string = "Check out https://example.com and http://test.com for more information.";
$result = preg_replace_callback_array($patterns, $string);
echo $result;
このコードは、テキスト内のすべてのURLドメイン名をM66.netに置き換えます。たとえば、https: //example.comはhttps://m66.netに置き換えられます。
preg_match_allとpreg_replace_callback_arrayを組み合わせた完全な例を以下に示します。これは、URLを抽出し、そのドメイン名をm66.netとして置き換えることができます。
<?php
// すべてを抽出します URL 并替换ドメイン名
$pattern = '/https?:\/\/([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+)/';
$string = "Check out https://example.com and http://test.com for more information.";
// 抽出する URL
preg_match_all($pattern, $string, $matches);
print_r($matches);
// 替换ドメイン名
$patterns = [
'/https?:\/\/([a-zA-Z0-9-]+\.[a-zA-Z0-9-]+)/' => function($matches) {
return str_replace($matches[1], 'm66.net', $matches[0]);
}
];
// 文字列を交換します URL ドメイン名
$result = preg_replace_callback_array($patterns, $string);
echo $result;
?>
preg_match_allとpreg_replace_callback_arrayを組み合わせることにより、最初に必要な文字列コンテンツを抽出してから、これらのコンテンツでカスタム交換操作を実行できます。この方法は非常に柔軟で、さまざまな複雑な文字列処理タスクに適用できます。
正規表現を使用してテキストを処理する場合、特にURLや電子メールアドレスなどの比較的固定された形式でテキストを処理する場合、さまざまな抽出および交換タスクをより効率的に完了できます。