使用旧 php 版本的正则表达式进行 URL 验证


Url validation with regex for old php version

注意:我使用的是较旧的 PHP 版本,因此FILTER_VALIDATE_URL目前不可用。

经过多次搜索,我仍然无法找到可以涵盖所有URL结构可能性的确切答案,但最后我将使用这种方式:

我正在使用以下函数

1)获得正确方案的功能

function convertUrl ($url){
    $pattern = '#^http[s]?://#i';
    if(preg_match($pattern, $url) == 1) { // this url has proper scheme
        return $url;
    } else {
        return 'http://' . $url;
    }
}

2)有条件检查它是否是URL

if (preg_match("/'b(?:(?:https?|ftp):'/'/|www'.)[-a-z0-9+&@#'/%?=~_|!:,.;]*[-a-z0-9+&@#'/%=~_|]/i", $url)) {
  echo "URL is valid";
}else {
  echo "URL is invalid<br>";
}

你猜怎么着!?它非常适合所有这些可能性:

$url = "google.com";
$url = "www.google.com";
$url = "http://google.com";
$url = "http://www.google.com";
$url = "https://google.com";
$url = "https://www.codgoogleekarate.com";
$url = "subdomain.google.com";
$url = "https://subdomain.google.com";

但仍然有这个边缘情况

$url = "blahblahblahblah";

函数convertUrl($url)会将其转换为$url = "http://blahblahblahblah";然后正则表达式会将其视为有效的 URL,而事实并非如此!!

如何编辑它,使其不会传递具有此结构的 URL http://blahblahblahblah

如果要验证互联网网址,请添加检查以在正则表达式中包含点 (.) 字符。

Note: http://blahblahblah is a valid url as is http://localhost

试试这个:

if (preg_match("/^((['w]+:)?'/'/)?((['d'w]|%[a-fA-f'd]{2,2})+(:(['d'w]|%[a-fA-f'd]{2,2})+)?@)?(['d'w][-'d'w]{0,253}['d'w]'.)+['w]{2,4}(:['d]+)?('/([-+_~.'d'w]|%[a-fA-f'd]{2,2})*)*('?(&?([-+_~.'d'w]|%[a-fA-f'd]{2,2})=?)*)?(#([-+_~.'d'w]|%[a-fA-f'd]{2,2})*)?$/", $url)) {
  echo "URL is valid";
}else {
  echo "URL is invalid<br>";
}