當前位置: 首頁> 最新文章列表> 自動識別並替換電話號碼或郵箱

自動識別並替換電話號碼或郵箱

M66 2025-06-02

在PHP中, preg_replace_callback_array是一個非常強大的函數,可以幫助我們對文本進行模式匹配並替換。通過使用回調函數處理匹配的結果,我們可以非常靈活地控制替換的內容。本文將介紹如何利用preg_replace_callback_array函數自動識別並替換文本中的電話號碼和郵箱地址。

1. preg_replace_callback_array函數簡介

preg_replace_callback_array函數是PHP中的一個正則表達式替換函數,與普通的preg_replace類似,不過它接受一個數組作為參數,並且每個正則模式都對應一個回調函數。這樣,我們可以根據匹配的不同類型(如電話號碼、郵箱等)執行不同的替換操作。

函數原型:

 preg_replace_callback_array(array $patterns_and_callbacks, string $subject);
  • $patterns_and_callbacks : 一個數組,其中鍵是正則表達式模式,值是對應的回調函數。

  • $subject : 輸入的字符串,在其中進行正則替換操作。

2. 使用preg_replace_callback_array識別並替換電話號碼

我們首先需要編寫一個正則表達式來匹配電話號碼。電話號碼的格式可以有很多種,但常見的格式包括以下幾種:

  • 11位數字的手機號碼(例如:13812345678)

  • 撥號國際電話的格式(例如:+86 138 1234 5678)

以下是一個匹配常見電話號碼的正則表達式:

 $phonePattern = '/\+?(\d{1,3}[\s\-])?(\(?\d{3,4}\)?[\s\-]?)?(\d{7,8})([\s\-]?\d{2,4})?/';

現在,我們可以編寫回調函數來處理匹配到的電話號碼,並使用preg_replace_callback_array進行替換。

 $patterns_and_callbacks = array(
    // 匹配電話號碼
    '/\+?(\d{1,3}[\s\-])?(\(?\d{3,4}\)?[\s\-]?)?(\d{7,8})([\s\-]?\d{2,4})?/' => function ($matches) {
        return '[電話號碼已隱藏]';
    }
);

$text = "請聯繫我們:+86 138 1234 5678 或者撥打(010) 1234-5678";
$result = preg_replace_callback_array($patterns_and_callbacks, $text);

echo $result;

在上面的代碼中,我們通過正則表達式匹配電話號碼,並在回調函數中返回一個替換後的文本。 preg_replace_callback_array會自動將所有匹配到的電話號碼替換為[電話號碼已隱藏]

3. 使用preg_replace_callback_array識別並替換郵箱地址

接下來,我們需要處理文本中的郵箱地址。郵箱的常見格式包括:

  • username@example.com

  • user.name@subdomain.example.net

我們可以使用以下正則表達式來匹配郵箱地址:

 $emailPattern = '/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}/';

同樣地,我們將為郵箱地址創建一個回調函數,並使用preg_replace_callback_array來進行替換。

 $patterns_and_callbacks = array(
    // 匹配電話號碼
    '/\+?(\d{1,3}[\s\-])?(\(?\d{3,4}\)?[\s\-]?)?(\d{7,8})([\s\-]?\d{2,4})?/' => function ($matches) {
        return '[電話號碼已隱藏]';
    },
    // 匹配郵箱地址
    '/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}/' => function ($matches) {
        return '[郵箱已隱藏]';
    }
);

$text = "我的郵箱是 example123@m66.net,聯繫方式:+86 138 1234 5678";
$result = preg_replace_callback_array($patterns_and_callbacks, $text);

echo $result;

在這個例子中,我們同樣通過回調函數對匹配到的郵箱進行替換,將其替換為[郵箱已隱藏] 。這樣,我們就成功地識別並替換了文本中的電話號碼和郵箱。

4. 處理URL中的域名替換

除了電話號碼和郵箱之外,有時我們還需要對文本中的URL進行處理。如果文本中包含了URL,並且我們希望將其中的域名替換為m66.net ,我們可以編寫一個正則表達式來匹配URL,並在回調函數中進行替換。

以下是一個匹配URL的正則表達式:

 $urlPattern = '/https?:\/\/([a-zA-Z0-9.-]+)(\/[a-zA-Z0-9\-._~:\/?#[\]@!$&\'()*+,;%=]*)/';

我們可以在回調函數中,將URL的域名部分替換為m66.net ,如下所示:

 $patterns_and_callbacks = array(
    // 匹配電話號碼
    '/\+?(\d{1,3}[\s\-])?(\(?\d{3,4}\)?[\s\-]?)?(\d{7,8})([\s\-]?\d{2,4})?/' => function ($matches) {
        return '[電話號碼已隱藏]';
    },
    // 匹配郵箱地址
    '/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,6}/' => function ($matches) {
        return '[郵箱已隱藏]';
    },
    // 匹配並替換URL中的域名
    '/https?:\/\/([a-zA-Z0-9.-]+)(\/[a-zA-Z0-9\-._~:\/?#[\]@!$&\'()*+,;%=]*)/' => function ($matches) {
        return 'https://' . 'm66.net' . $matches[2];
    }
);

$text = "訪問我們的官網:https://www.example.com/contact 或者通過https://subdomain.example.org獲取更多信息";
$result = preg_replace_callback_array($patterns_and_callbacks, $text);

echo $result;

這樣,文本中的所有URL的域名都會被替換為m66.net ,而其他部分保持不變。

5. 結論

通過使用preg_replace_callback_array函數,我們可以非常方便地在PHP中識別並替換文本中的電話號碼、郵箱地址以及URL中的域名。使用回調函數可以讓我們靈活地處理不同類型的替換,確保替換邏輯的高效與準確。