【问题标题】:Regex for parsing url PHP用于解析 url PHP 的正则表达式
【发布时间】:2011-08-18 04:26:53
【问题描述】:

我需要查找给定的 url 是否有效,如果它包含有 url,则应该允许它

1.通用顶级域 2.国家代码顶级域名 参考下面的网址 http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains

我需要在 PHP 中执行此操作,这就是我目前正在做的事情

$regexUrl = "((https?|ftp)\:\/\/)?"; // 方案 $regexUrl .= "([a-zA-Z0-9+!*(),;?&=\$_.-]+(\:[a-zA-Z0-9+!*(),;? &=\$_.-]+)?@)?"; // 用户和通行证 $regexUrl .= "([a-zA-Z0-9-]+)\.([a-zA-Z]{2,3})"; //主机或IP $regexUrl .= "(\:[0-9]{2,5})?"; // 港口 $regexUrl .= "(\/([a-zA-Z0-9+\$_-]\.?)+)*\/?"; // 小路 $regexUrl .= "(\?[a-zA-Z+&\$_.-][a-zA-Z0-9;:@&%=+\/\$_.-]*)?"; // 获取查询 $regexUrl .= "(#[a-zA-Z_.-][a-zA-Z0-9+\$_.-]*)?"; // 锚 //if(preg_match_all("#\bhttps?://[^\s()]+(?:\([\w\d]+\)|([^[:punct:]\s]|/ ))#", $message, $matches1, PREG_PATTERN_ORDER)) //$pattern = '/((https?|ftp)\:(\/\/)|(文件\:\/{2,3}))?(((25[0-5]|2[0 -4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9] |[01]?[0-9][0-9]?))|(((([a-zA-Z0-9]+)(\.)?)+)(\.)(com|org |net|gov|mil|biz|info|mobi|name|aero|jobs|museum|[a-z]{2}))([\/][\/a-zA-Z0-9\.]*)* ([\/]?(([\?][a-zA-Z0-9]+[\=][a-zA-Z0-9\%\(\)]*)([\&][a -zA-Z0-9]+[\=][a-zA-Z0-9\%\(\)]*)*))?/'; if(preg_match_all("/$regexUrl/", $urlMessage, $matches1, PREG_PATTERN_ORDER)) { 尝试 { foreach($matches1[0] as $urlToTrim1) { $url= $urlToTrim1; 回声 $url; } } 捕获(异常 $e) { $url="-1"; } }

【问题讨论】:

标签: php regex url


【解决方案1】:

判断它是否通常是一个有效的 URL:

filter_var($url, FILTER_VALIDATE_URL)

http://www.php.net/manual/en/function.filter-var.php

如果您想确认 TLD 是否在您的批准列表中(我不知道 filter_var 是否会检查 TLD 是否实际存在):

$host = parse_url($url, PHP_URL_HOST);
$tld = substr($host, strrpos($host, '.') + 1);

// check if $tld is in a list of allowed TLDs

或者只是尝试使用gethostbyname 查找域的DNS 记录。如果存在,则它是一个有效的域。*


* 除非您被 DNS 欺骗,否则如果这种情况对您很重要...

【讨论】:

    猜你喜欢
    • 2019-10-25
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多