收集整理 10 個高頻使用、經過實戰驗證的 PHP 代碼片段,涵蓋地理位置計算、HTTP 請求、安全過濾、字符串處理、加密雜湊、Twitter 整合等實用場景。建議收藏備用,項目中直接引用或按需改造。
/**
* 計算兩點球面距離
* @return array [miles, feet, yards, kilometers, meters]
*/
function getDistance($lat1, $lon1, $lat2, $lon2) {
$theta = $lon1 - $lon2;
$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +
cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
return [
'miles' => $miles,
'feet' => $miles * 5280,
'yards' => $miles * 1760,
'kilometers'=> $miles * 1.609344,
'meters' => $miles * 1609.344,
];
}
// 紐約兩地標示例
$p1 = ['lat'=>40.770623, 'lon'=>-73.964367];
$p2 = ['lat'=>40.758224, 'lon'=>-73.917404];
print_r(getDistance($p1['lat'], $p1['lon'], $p2['lat'], $p2['lon']));
// 輸出: ~2.6 英里 / 4.19 公里
function xcurl($url, $ref = null, $post = [], $ua = "Mozilla/5.0 (compatible; PHPBot/1.0)", $print = false) {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_AUTOREFERER => true,
CURLOPT_REFERER => $ref,
CURLOPT_HEADER => 0,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_USERAGENT => $ua,
CURLOPT_SSL_VERIFYPEER => false, // 生產環境請設置 true 並配置 CA
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_TIMEOUT => 30,
]);
if ($post) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
}
$output = curl_exec($ch);
curl_close($ch);
return $print ? print($output) : $output;
}
// 用法
$html = xcurl('https://api.example.com/user', null, ['id'=>123]);
$data = json_decode($html, true);
function cleanInput($input) {
$search = [
'@<script[^>]*>.*?</script>@si', // JS
'@<[\/\!]*?[^<>]*>@si', // HTML 標簽
'@<style[^>]*>.*?</style>@siU', // CSS
'@@' // 多行註釋
];
return preg_replace($search, '', $input);
}
function sanitize($input) {
if (is_array($input)) {
return array_map('sanitize', $input);
}
if (get_magic_quotes_gpc()) {
$input = stripslashes($input);
}
$input = cleanInput($input);
// 資料庫層面請使用預處理,此處僅作輸出編碼演示
return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
}
// 用法
$safe = sanitize($_POST); // 遞歸清洗整個 POST
function detectCity($ip = '') {
$default = '未知地區';
if (!$ip || $ip === '127.0.0.1' || $ip === '::1') $ip = '8.8.8.8'; // 默認查詢 Google DNS
$url = "https://ip-api.com/json/{$ip}?lang=zh-CN"; // 免費 API,每日限制
$json = @file_get_contents($url);
if (!$json) return $default;
$data = json_decode($json, true);
if (($data['status'] ?? '') === 'success') {
return ($data['city'] ?? '') . ' ' . ($data['regionName'] ?? '');
}
return $default;
}
// 用法
echo detectCity($_SERVER['REMOTE_ADDR']); // 如:北京 北京
function passwordStrength($pwd) {
$len = strlen($pwd);
if ($len === 0) return 0;
$pools = 0;
if (preg_match('/[a-z]/', $pwd)) $pools += 26;
if (preg_match('/[A-Z]/', $pwd)) $pools += 26;
if (preg_match('/\d/', $pwd)) $pools += 10;
if (preg_match('/[^a-zA-Z0-9]/', $pwd)) $pools += 32;
// 熵值 = log2(pool^len) = len * log2(pool)
$entropy = $len * log($pools, 2);
// 映射到 0-100
$score = min(100, intval($entropy * 2));
return $score;
}
var_dump(passwordStrength("Correct Horse Battery Staple")); // 100
var_dump(passwordStrength("Super Monkey Ball")); // ~70
var_dump(passwordStrength("Tr0ub4dor&3")); // ~85
var_dump(passwordStrength("abc123")); // ~20
var_dump(passwordStrength("sweet")); // ~10
function getClientLanguage(array $available = ['en','zh','ja','ko'], $default = 'en') {
if (empty($_SERVER['HTTP_ACCEPT_LANGUAGE'])) return $default;
$langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
foreach ($langs as $lang) {
$code = strtolower(substr(trim($lang), 0, 2));
if (in_array($code, $available)) return $code;
}
return $default;
}
// 用法
$lang = getClientLanguage(['zh','en','ja']); // 返回 zh/en/ja 之一
function dataUri(string $file, string $mime): string {
if (!is_file($file)) throw new InvalidArgumentException("文件不存在: $file");
$data = base64_encode(file_get_contents($file));
return "data:{$mime};base64,{$data}";
}
// 用法
// CSS: background-image: url(<?= dataUri('logo.png', 'image/png') ?>);
// HTML: <img src="<?= dataUri('icon.svg', 'image/svg+xml') ?>" />
function makeSeoSlug(string $title): string {
$slug = strtolower(trim($title));
$slug = preg_replace('/[^a-z0-9\s-]/', '', $slug); // 只保留字母數字空格連字符
$slug = preg_replace('/[\s-]+/', '-', $slug); // 多空格/連字符合併
return trim($slug, '-');
}
echo makeSeoSlug("This foo's bar is rockin' cool!");
// 輸出: this-foos-bar-is-rockin-cool
function fue($data, int $rounds = 10): string {
$hash = $data;
for ($i = 0; $i < $rounds; $i++) {
$hash = base64_encode($hash);
$hash = md5($hash);
$hash = sha1($hash);
$hash = hash('sha256', $hash);
$hash = hash('sha512', $hash);
}
return $hash;
}
// 用法:存儲密碼雜湊(實際項目請用 password_hash/password_verify)
$stored = fue('user_password', 20);
class TwitterFeed {
private $apiUrl = 'https://api.twitter.com/1.1/';
private $bearerToken; // 需申請 Bearer Token
public function __construct(string $bearerToken) {
$this->bearerToken = $bearerToken;
}
public function getUserTimeline(string $screenName, int $count = 20): array {
$url = $this->apiUrl . "statuses/user_timeline.json?screen_name={$screenName}&count={$count}&tweet_mode=extended";
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $this->bearerToken],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => true,
]);
$json = curl_exec($ch);
curl_close($ch);
$data = json_decode($json, true);
$tweets = [];
foreach ($data as $tweet) {
$tweets[] = [
'id' => $tweet['id_str'],
'text' => $tweet['full_text'],
'time' => $tweet['created_at'],
'url' => "https://twitter.com/{$screenName}/status/{$tweet['id_str']}",
];
}
return $tweets;
}
}
// 現代前端調用示例
$feed = new TwitterFeed('YOUR_BEARER_TOKEN');
$tweets = $feed->getUserTimeline('phpnet', 5);
foreach ($tweets as $t) {
echo "<div class='tweet'><a href='{$t['url']}' target='_blank'>{$t['text']}</a> <small>{$t['time']}</small></div>";
}
password_hash() / password_verify(),不要自行造輪子CURLOPT_SSL_VERIFYPEER => true 並配置 CURLOPT_CAINFO