首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

10 個超實用 PHP 代碼片段:地理計算、cURL 封裝、輸入清洗、密碼強度、SEO URL 與更多

     編輯:PHP 綜合知識

前言

收集整理 10 個高頻使用、經過實戰驗證的 PHP 代碼片段,涵蓋地理位置計算、HTTP 請求、安全過濾、字符串處理、加密雜湊、Twitter 整合等實用場景。建議收藏備用,項目中直接引用或按需改造。

1. 經緯度距離計算(Haversine 公式)

/**
 * 計算兩點球面距離
 * @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 公里

2. 終極 cURL 封裝(支持 GET/POST、Referer、UA、SSL、重定向)

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);

3. 輸入清洗:防 XSS、SQL 注入、腳本注入

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

4. IP 地理位置檢測(城市/省份)

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']); // 如:北京 北京

5. 密碼強度評分(基於熵值估算)

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

6. 瀏覽器語言自動檢測(支持優先級排序)

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 之一

7. Data URI 生成器(小圖片內聯嵌入 CSS/HTML)

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') ?>" />

8. SEO 友好 URL Slug 生成

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

9. 多層加密雜湊(防彩虹表、延緩暴力破解)

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);

10. Twitter 時間線獲取類(OAuth 1.0a 版本已棄用,此為歷史參考)

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(),不要自行造輪子
  • cURL SSL:生產環境 CURLOPT_SSL_VERIFYPEER => true 並配置 CURLOPT_CAINFO
  • IP 地理:免費 API 有頻率限制,高併發請自建 GeoIP 數據庫
  • Twitter API:v1.1 已停用,遷移至 v2 (OAuth 2.0 Bearer Token)
  • 輸入清洗:輸出時根據上下文編碼,資料庫層使用預處理語句
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved