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

PHP 與 JavaScript 雙端驗證:IP 地址與域名格式檢測完整代碼

     編輯:PHP 綜合知識

驗證策略:雙端同步,後端為準

  • 前端:即時提示用戶、減少無效請求
  • 後端:最終防線、不可繞過、邏輯一致

PHP 版:checkIp() 函數

<?php
/**
 * 驗證 IPv4 或域名格式
 * @param string $ip 輸入字串(可含 https://、https://、空格、尾斜線)
 * @return bool
 */
function checkIp(string $ip): bool {
    // 1. 正規化
    $ip = trim($ip);
    $ip = strtolower($ip);
    $ip = preg_replace('#^https?://#', '', $ip);
    $ip = rtrim($ip, '/');

    // 2. 含字母/底劃線/連字符 → 視為域名
    if (preg_match('/[a-z_-]/', $ip)) {
        // 域名正則(涵蓋常見頂級域與多級子域)
        $domainRegex = '/^([\w-]+\.)+(com|net|org|gov\.cn|info|cc|com\.cn|net\.cn|org\.cn|name|biz|tv|cn|mobi|sh|ac|io|tw|com\.tw|hk|com\.hk|ws|travel|us|tm|la|me\.uk|org\.uk|ltd\.uk|plc\.uk|in|eu|it|jp|co|me|mx|ca|ag|com\.co|net\.co|nom\.co|com\.ag|net\.ag|fr|org\.ag|am|asia|at|be|bz|com\.bz|net\.bz|net\.br|com\.br|de|es|com\.es|nom\.es|org\.es|fm|gs|co\.in|firm\.in|gen\.in|ind\.in|net\.in|org\.in|jobs|ms|com\.mx|nl|nu|co\.nz|net\.nz|org\.nz|tc|tk|org\.tw|idv\.tw|co\.uk|vg|ad|ae|af|ai|al|an|ao|aq|ar|as|au|aw|az|ba|bb|bd|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|cd|cf|cg|ch|ci|ck|cl|cm|cr|cu|cv|cx|cy|cz|dj|dk|dm|do|dz|ec|ee|eg|er|et|fi|fj|fk|fo|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gt|gu|gw|gy|hm|hn|hr|ht|hu|id|ie|il|im|iq|ir|is|je|jm|jo|ke|kg|kh|ki|km|kn|kr|kw|ky|kz|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|mt|mu|mv|mw|my|mz|na|nc|ne|nf|ng|ni|no|np|nr|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|si|sk|sl|sm|sn|sr|st|sv|sy|sz|td|tf|tg|th|tj|tl|tn|to|tr|tt|tz|ua|ug|uk|uy|uz|va|vc|ve|vi|vn|vu|wf|ye|yt|yu|za|zm|zw)$/i';
        return (bool)preg_match($domainRegex, $ip);
    }

    // 3. 純數字+點 → 視為 IPv4
    $parts = explode('.', $ip);
    if (count($parts) !== 4) return false;
    foreach ($parts as $part) {
        if ($part === '' || !ctype_digit($part)) return false;
        $num = (int)$part;
        if ($num > 255) return false;
        // 可選:禁止前導零(如 01.2.3.4)
        // if (strlen($part) > 1 && $part[0] === '0') return false;
    }
    return true;
}

// 測試
var_dump(checkIp('192.168.1.1'));        // true
var_dump(checkIp('256.1.1.1'));          // false
var_dump(checkIp('www.example.com'));    // true
var_dump(checkIp('https://test.org/'));   // true
var_dump(checkIp('invalid..domain'));    // false

JavaScript 版:checkIP() 函數

<script>
/**
 * 前端驗證,邏輯與 PHP 版保持一致
 * @param {HTMLInputElement} input 輸入框元素
 * @returns {boolean} 驗證通過返回 true,否則 alert 提示並返回 false
 */
function checkIP(input) {
    let ip = input.value.trim();
    // 正規化
    ip = ip.replace(/\s+/g, '');
    ip = ip.replace(/^https?:\/\//i, '');
    ip = ip.replace(/\/$/, '');
    input.value = ip; // 回寫正規化後的值

    // 域名模式
    const domainRegex = /^([\w-]+\.)+(com|net|org|gov\.cn|info|cc|com\.cn|net\.cn|org\.cn|name|biz|tv|cn|mobi|sh|ac|io|tw|com\.tw|hk|com\.hk|ws|travel|us|tm|la|me\.uk|org\.uk|ltd\.uk|plc\.uk|in|eu|it|jp|co|me|mx|ca|ag|com\.co|net\.co|nom\.co|com\.ag|net\.ag|fr|org\.ag|am|asia|at|be|bz|com\.bz|net\.bz|net\.br|com\.br|de|es|com\.es|nom\.es|org\.es|fm|gs|co\.in|firm\.in|gen\.in|ind\.in|net\.in|org\.in|jobs|ms|com\.mx|nl|nu|co\.nz|net\.nz|org\.nz|tc|tk|org\.tw|idv\.tw|co\.uk|vg|ad|ae|af|ai|al|an|ao|aq|ar|as|au|aw|az|ba|bb|bd|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|cd|cf|cg|ch|ci|ck|cl|cm|cr|cu|cv|cx|cy|cz|dj|dk|dm|do|dz|ec|ee|eg|er|et|fi|fj|fk|fo|ga|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gt|gu|gw|gy|hm|hn|hr|ht|hu|id|ie|il|im|iq|ir|is|je|jm|jo|ke|kg|kh|ki|km|kn|kr|kw|ky|kz|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|mt|mu|mv|mw|my|mz|na|nc|ne|nf|ng|ni|no|np|nr|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|ru|rw|sa|sb|sc|sd|se|sg|si|sk|sl|sm|sn|sr|st|sv|sy|sz|td|tf|tg|th|tj|tl|tn|to|tr|tt|tz|ua|ug|uk|uy|uz|va|vc|ve|vi|vn|vu|wf|ye|yt|yu|za|zm|zw)$/i;

    if (/[a-z_-]/i.test(ip)) {
        if (!domainRegex.test(ip)) {
            alert('不是正確的域名格式');
            input.focus();
            return false;
        }
    } else {
        // IPv4
        const parts = ip.split('.');
        if (parts.length !== 4) {
            alert('不是正確的 IP 格式');
            input.focus();
            return false;
        }
        for (const part of parts) {
            if (part === '' || !/^\d+$/.test(part) || parseInt(part, 10) > 255) {
                alert('不是正確的 IP 格式');
                input.focus();
                return false;
            }
        }
    }
    return true;
}
</script>

<!-- 使用範例 -->
<form name="ipform" onsubmit="return checkIP(this.ip)">
  <input type="text" name="ip" placeholder="輸入 IP 或域名">
  <button type="submit">驗證</button>
</form>

現代化替代方案

<?php
// PHP 7.2+ 推薦使用內建過濾器
function checkIpModern(string $ip): bool {
    $ip = trim(strtolower(preg_replace('#^https?://#', '', $ip)));
    $ip = rtrim($ip, '/');
    if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) return true;
    if (filter_var($ip, FILTER_VALIDATE_DOMAIN, FILTER_FLAG_HOSTNAME)) return true;
    return false;
}

// 或使用 Symfony Validator / Laravel Validation 等框架組件

注意:FILTER_VALIDATE_DOMAIN 對國際化域名(IDN)支援有限,複雜業務仍建議自帶正則或使用 egulias/email-validator 類庫的域名驗證組件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved