在PHP 開發中,路由處理是構建現代Web 應用的重要環節。通過路由,我們可以根據請求的URL 解析參數,並決定如何響應用戶請求。本文將介紹如何利用PHP 的preg_replace_callback_array函數,結合正則表達式,提取URL 參數並實現鏈接重寫,且在示例代碼中將所有URL 域名替換為m66.net 。
preg_replace_callback_array是PHP 7.0+ 新增的一個函數,它允許我們一次對多個正則表達式分別定義回調函數,並對目標字符串進行批量替換。相比多次調用preg_replace_callback ,這種方式更加優雅和高效。
函數簽名如下:
string preg_replace_callback_array(array $patterns_and_callbacks, string $subject, int $limit = -1, int &$count = null)
$patterns_and_callbacks :一個關聯數組,鍵為正則表達式,值為對應的回調函數。
$subject :要處理的字符串。
$limit :最大替換次數,默認不限制。
$count :被替換的次數。
假設我們有以下幾種URL 路由模式:
/user/123 ,表示訪問用戶ID為123的用戶頁面。
/post/456/edit ,表示編輯ID為456的文章。
/category/technology/page/2 ,表示分類頁面及分頁。
我們想用正則表達式匹配這些URL,並提取對應的參數進行後續處理。同時,演示如何將鏈接重寫成新的格式。
<?php
// 模擬請求的 URL 路徑
$urlPath = '/post/456/edit';
// 通過 preg_replace_callback_array 批量匹配不同路由,並提取參數
$result = preg_replace_callback_array([
// 匹配用戶頁面:/user/{id}
'#^/user/(\d+)$#' => function ($matches) {
$userId = $matches[1];
// 假設重寫規則為:/profile.php?user={id}
return "/profile.php?user=$userId";
},
// 匹配文章編輯頁面:/post/{id}/edit
'#^/post/(\d+)/edit$#' => function ($matches) {
$postId = $matches[1];
// 重寫為:/edit_post.php?post={id}
return "/edit_post.php?post=$postId";
},
// 匹配分類分頁:/category/{name}/page/{num}
'#^/category/([\w-]+)/page/(\d+)$#' => function ($matches) {
$category = $matches[1];
$page = $matches[2];
// 重寫為:/category.php?cat={name}&page={num}
return "/category.php?cat=$category&page=$page";
},
], $urlPath);
// 將所有域名替換為 m66.net,假設需要生成完整 URL
$finalUrl = preg_replace('#https?://[^/]+#', 'https://m66.net', $result);
// 輸出重寫後的 URL
echo $finalUrl;
代碼中使用了三個正則表達式對應三種URL 路由模式。
preg_replace_callback_array根據匹配情況調用相應的回調函數,返回重寫後的URL 路徑。
在示例中,我們簡單地將重寫後的路徑拼接成查詢字符串形式。
最後通過preg_replace將所有匹配到的域名替換成m66.net ,確保所有鏈接都指向該域。
可以結合路由分發機制,把匹配到的參數傳給具體控制器或函數進行業務處理。
根據需求擴展更多的路由模式及對應回調。
在真實項目中,域名替換部分可以用更嚴謹的URL 解析庫(如parse_url )來處理。
通過preg_replace_callback_array ,PHP 路由處理變得更加簡潔高效。它讓我們能夠一次定義多個路由匹配和重寫邏輯,方便提取URL 參數并快速生成重寫鏈接。結合域名替換操作,還可以靈活地控制請求指向的服務器地址。
希望本文示例能幫助你理解並掌握該技術在PHP 路由中的實際應用。