在日常 PHP 開發中,有些功能模塊幾乎每個項目都會用到。本文精選了 10 個經典且實用的代碼片段,涵蓋郵件發送、編碼轉換、IP 獲取、日期驗證、郵箱驗證、XML 解析、數據庫連接、JSON 處理、時間戳轉換以及壓縮包解壓等核心場景,幫助開發者快速解決常見問題,提升編碼效率。
PHP 內置的 mail() 函數雖然簡單,但配合完整的 Header 即可發送支持 HTML 格式的郵件。注意設置正確的 MIME 版本、字符集與回覆地址,可大幅提高郵件送達率。
$to = "viralpatel.net@gmail.com"; $subject = "VIRALPATEL.net"; $body = "Body of your message here you can use HTML too. e.g. <br> <b> Bold </b>"; $headers = "From: Peter\r\n"; $headers .= "Reply-To: info@yoursite.com\r\n"; $headers .= "Return-Path: info@yoursite.com\r\n"; $headers .= "X-Mailer: PHP5\n"; $headers .= 'MIME-Version: 1.0' . "\n"; $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; mail($to, $subject, $body, $headers);
標準 Base64 包含 +、/、= 等特殊字符,在 URL 傳遞時會出現問題。以下兩個函數將其替換為 URL 安全字符,適用於 Token 生成、參數加密等場景。
function base64url_encode($plainText) {
$base64 = base64_encode($plainText);
$base64url = strtr($base64, '+/=', '-_,');
return $base64url;
}
function base64url_decode($plainText) {
$base64url = strtr($plainText, '-_,', '+/=');
$base64 = base64_decode($base64url);
return $base64;
}
由於代理、負載均衡等網絡環境,$_SERVER['REMOTE_ADDR'] 往往不是真實客戶端 IP。此函數依次檢查 HTTP_CLIENT_IP、HTTP_X_FORWARDED_FOR,最後回退到 REMOTE_ADDR,較為可靠地獲取真實 IP。
function getRealIPAddr() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ip = $_SERVER['REMOTE_ADDR'];
}
return $ip;
}
使用正則表達式匹配格式,再調用 checkdate() 驗證日期合法性(如 2 月 30 日會返回 false),避免無效日期入庫。
function checkDateFormat($date) {
if (preg_match("/^([0-9]{4})-([0-9]{2})-([0-9]{2})$/", $date, $parts)) {
return checkdate($parts[2], $parts[3], $parts[1]);
}
return false;
}
雖然正則無法 100% 覆蓋 RFC 5322 標準,但以下模式能覆蓋 99% 的常見郵箱格式,適合表單前端驗證與後端二次校驗。
$email = $_POST['email'];
if (preg_match("~([a-zA-Z0-9!#$%&'*+-/=?^_`{|}~])@([a-zA-Z0-9-]).([a-zA-Z0-9]{2,4})~", $email)) {
echo 'This is a valid email.';
} else {
echo 'This is an invalid email.';
}
PHP 的 simplexml_load_string() 將 XML 字符串轉為對象,支持屬性訪問($record['name'])與節點遍歷($record->symbol),代碼極其簡潔。
$xml_string = "<?xml version='1.0'?> <moleculedb> <molecule name='Benzine'> <symbol>ben</symbol> <code>A</code> </molecule> <molecule name='Water'> <symbol>h2o</symbol> <code>K</code> </molecule> </moleculedb>";
$xml = simplexml_load_string($xml_string);
foreach ($xml->molecule as $record) {
echo $record['name'], ' ';
echo $record->symbol, ' ';
echo $record->code, '<br />';
}
此腳本將連接參數集中管理,並通過 basename(__FILE__) 防止直接訪問,包含文件時自動建立連接,適合中小型項目快速接入。
<?php
if (basename(__FILE__) == basename($_SERVER['PHP_SELF'])) send_404();
$dbHost = "localhost";
$dbUser = "xxxx";
$dbPass = "xxxx";
$dbDatabase = "xxxx";
$db = mysql_connect("$dbHost", "$dbUser", "$dbPass") or die ("Error connecting to database.");
mysql_select_db("$dbDatabase", $db) or die ("Couldn't select the database.");
function send_404() {
header('HTTP/1.x 404 Not Found');
print '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">'."\n".
'<html><head>'."\n".
'<title>404 Not Found</title>'."\n".
'</head><body>'."\n".
'<h1>Not Found</h1>'."\n".
'<p>The requested URL '. str_replace(strstr($_SERVER['REQUEST_URI'], '?'), '', $_SERVER['REQUEST_URI']). ' was not found on this server.</p>'."\n".
'</body></html>'."\n";
exit;
}
?>
PHP 5.2+ 內置 json_encode() / json_decode(),輕鬆實現數組與 JSON 字符串互轉,支持多維數組與對象嵌套,是 API 開發的基石。
$json_data = array('id'=>1, 'name'=>"rolf", 'country'=>'russia', "office"=>array("google","oracle"));
echo json_encode($json_data);
直接在 SQL 中使用 UNIX_TIMESTAMP() 函數,將 DATETIME 或 TIMESTAMP 類型字段轉為整數時間戳,便於前端 JS 直接處理或跨系統傳輸。
$query = "select UNIX_TIMESTAMP(date_field) as mydate from mytable where 1=1";
$records = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($records)) {
echo $row['mydate'];
}
調用系統 unzip 命令配合 PHP 文件操作,實現解壓後自動移動文件並清理臨時目錄,適合上傳包自動部署場景。
<?php
function unzip($location, $newLocation) {
if (exec("unzip $location", $arr)) {
mkdir($newLocation);
for ($i = 1; $i < count($arr); $i++) {
$file = trim(preg_replace("~inflating: ~", "", $arr[$i]));
copy($location . '/' . $file, $newLocation . '/' . $file);
unlink($location . '/' . $file);
}
return TRUE;
}
return FALSE;
}
?>
// 使用示例
<?php
include 'functions.php';
if (unzip('zipedfiles/test.zip', 'unziped/myNewZip'))
echo 'Success!';
else
echo 'Error';
?>
推薦使用單引號聲明純文本字符串,性能略優於雙引號且無需轉義變量。
$str = 'Hello PHP'; echo $str;
返回子串首次出現的索引(從 0 開始),未找到返回 false。注意嚴格判斷 === false。
$str = 'Hello PHP'; echo strpos($str, 'o'); // 4 echo strpos($str, 'PH'); // 6
指定起始位置與長度,省略長度則截取至末尾。負數起始位置表示從末尾倒數。
$str = 'Hello PHP'; $str1 = substr($str, 2, 3); // 'llo' echo $str1;
將字符串按指定長度切分為數組,默認長度 1。常用於逐字符處理或固寬格式化。
$str = 'Hello PHP'; $result = str_split($str); // ['H','e','l','l','o',' ','P','H','P'] $result1 = str_split($str, 2); // ['He','ll','o ','PH','P'] print_r($result1);
按指定字符(如空格、逗號)分割字符串,返回數組。比 str_split 更靈活,適合 CSV、標籤等解析。
$str = 'Hello PHP Java C# C++';
$result = explode(' ', $str);
print_r($result);
使用點號 . 連接,或雙引號內直接解析變量。後者語法更簡潔,但僅限雙引號字符串。
$str = 'Hello PHP Java C# C++'; $num = 100; $str1 = $str . '<br/>Objective-C ' . $num; $str2 = "$str<br/>Objective-C $num"; echo $str1; echo $str2;