所以我在这里使用这个功能:
function get_domain($url)
{
$pieces = parse_url($url);
$domain = isset($pieces['host']) ? $pieces['host'] : '';
if (preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs)) {
return $regs['domain'];
}
return false;
}
$referer = get_domain($_SERVER['HTTP_REFERER']);
而我需要的是另一个正则表达式,如果有人愿意帮助的话。 正是我需要的是它获得整个域,包括子域。
让我们说现在是一个真正的问题。当人们博客链接来自示例:myblog.blogger.com referer url将只是blogger.com,这不是理想的..
因此,如果有人可以帮助我,那么我可以将包含子域名作为上述函数的正则表达式代码,id apreciate it alot!
谢谢!
答案 0 :(得分:9)
此正则表达式应匹配字符串中的域,包括任何dubdomains:
/([a-z0-9|-]+\.)*[a-z0-9|-]+\.[a-z]+/
翻译成粗糙的英语,它的功能如下:“匹配字符串的第一部分'sometextornumbers.sometext',还包括任意数量的'sometextornumbers'。可能先于它。
在此处查看此行动:http://regexr.com?2vppk
请注意,该链接中的多行和全局标志只能匹配整个测试文本blob,因此如果您只将一行传递给正则表达式,则不需要
答案 1 :(得分:0)
祝你好运,因为域名现在包含非罗马字符。在正则表达式可靠地工作之前,必须将它们处理成等效但唯一的ascii。请参阅RFC 3490国际化应用程序中的域名(IDNA)... 见https://tools.ietf.org/html/rfc3490
到目前为止,还没有使用域名的标准方法 ASCII指令表以外的字符。本文件定义了 国际化域名(IDN)和称为
的机制 国际化应用程序中的域名(IDNA)以便处理
他们以标准的方式。 IDN使用从大的字母中抽取的字符 repertoire(Unicode),但IDNA允许非ASCII字符为
仅使用已经允许的ASCII字符表示 今天叫主机名。这种向后兼容的表示是
在DNS等现有协议中需要,因此IDN可以是 引入时不改变现有的基础设施。 IDNA是
仅用于处理域名,而不是自由文本。
答案 2 :(得分:0)
更好的解决方案:
/^([a-z0-9|-]+[a-z0-9]{1,}\.)*[a-z0-9|-]+[a-z0-9]{1,}\.[a-z]{2,}$/
正则表达式示例: https://regexr.com/4k71a
对于电子邮件地址:
/^[a-z0-9|.|-]+[a-z0-9]{1,}@([a-z0-9|-]+[a-z0-9]{1,}\.)*[a-z0-9|-]+[a-z0-9]{1,}\.[a-z]{2,}$/
答案 3 :(得分:-1)
我想这是对第一个建议的优化。 主要改进:
sub..domain.xyz
https://((?:[a-z0-9-]+\.)*)([a-z0-9-]+\.[a-z]+)($|\s|\:\d{1,5})
测试一下:https://regex101.com/r/njFIil/1
这个正则表达式不处理任何 unicode 符号,这可能就是上面提到的问题。