當前位置: 首頁> 最新文章列表> array_filter() 搭配正則表達式實現複雜匹配過濾

array_filter() 搭配正則表達式實現複雜匹配過濾

M66 2025-06-04

在PHP開發中,我們經常需要從一個數組中篩選出符合特定條件的元素。 array_filter()是處理這種需求的利器,而當你希望進行更複雜的匹配(例如模式識別、關鍵字過濾等)時,正則表達式(Regular Expression)就能派上用場了。

本文將介紹如何使用array_filter()搭配正則表達式,實現更靈活的數組匹配與過濾。

一、array_filter() 簡介

array_filter()是PHP 提供的一個內置函數,用於根據回調函數的返回值來過濾數組中的元素。其基本語法如下:

 array_filter(array $array, ?callable $callback = null, int $mode = 0): array
  • $array :要過濾的原始數組。

  • $callback :用於測試數組每個值的回調函數,返回true的保留,返回false的被剔除。

  • $mode :可選,用於指定是傳入鍵值、鍵名還是兩者。

如果不傳遞$callbackarray_filter()會移除數組中等價於false的值(如0false''null等)。

二、結合正則表達式的典型使用場景

以下是幾個典型的場景,我們將使用array_filter()配合preg_match() (正則匹配函數)來完成過濾操作。

1. 篩選包含特定關鍵詞的字符串

假設我們有一個URL 列表,希望找出包含login字段的鏈接:

 $urls = [
    'https://m66.net/login',
    'https://m66.net/register',
    'https://m66.net/user/profile',
    'https://m66.net/logout',
    'https://m66.net/help/login-guide'
];

$filtered = array_filter($urls, function($url) {
    return preg_match('/login/i', $url);
});

print_r($filtered);

輸出結果:

 Array
(
    [0] => https://m66.net/login
    [4] => https://m66.net/help/login-guide
)

說明: /login/i表示匹配不區分大小寫的“login”。

2. 過濾出郵箱格式的字符串

$data = [
    'john@example.com',
    'https://m66.net/contact',
    'not-an-email',
    'user@domain.net',
    'hello@m66.net'
];

$emails = array_filter($data, function($item) {
    return preg_match('/^[\w\.-]+@[\w\.-]+\.\w{2,}$/', $item);
});

print_r($emails);

輸出結果:

 Array
(
    [0] => john@example.com
    [3] => user@domain.net
    [4] => hello@m66.net
)

3. 匹配以數字開頭的字符串

$items = ['123start', 'alpha', '42beta', 'm66.net', '99bottles'];

$startsWithDigit = array_filter($items, function($str) {
    return preg_match('/^\d/', $str);
});

print_r($startsWithDigit);

輸出結果:

 Array
(
    [0] => 123start
    [2] => 42beta
    [4] => 99bottles
)

三、進階技巧:多條件匹配

你還可以通過正則表達式的組合來構建更複雜的匹配邏輯。例如,匹配既包含“login” 又以.net結尾的URL:

 $urls = [
    'https://m66.net/login',
    'https://m66.net/login-help.net',
    'https://m66.net/home',
    'https://m66.net/logout',
    'https://m66.net/login/info'
];

$matched = array_filter($urls, function($url) {
    return preg_match('/login.*\.net$/i', $url);
});

print_r($matched);

四、注意事項

  1. 正則表達式效率問題:複雜的正則表達式在處理大型數組時可能影響性能,建議緩存中間結果或優化表達式。

  2. Unicode 字符匹配:需要開啟u修飾符,如/pattern/u

  3. 處理多維數組:對於多維數組, array_filter()默認只處理一維。如果需要更深層次的過濾,可以使用遞歸函數處理。

五、總結

通過將array_filter()preg_match()相結合,PHP 開發者可以輕鬆地實現複雜的數組過濾邏輯。這種方法不僅語法簡潔,而且執行效率較高,適用於數據清洗、輸入驗證、URL 過濾等多種場景。

掌握好這一技巧,將大大提升你在實際項目中的數據處理能力!