<?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
<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 類庫的域名驗證組件。