我有这样的网址:
我想拆分该网址以仅获取主机部分.为此,我正在使用
parse_url($url,PHP_URL_HOST);
Run Code Online (Sandbox Code Playgroud)
它返回www.w3schools.com.我想只获得'w3schools.com'.是否有任何功能或我必须手动执行?
有很多方法可以做到这一点.如果你知道你总是想要剥离'www',那么简单的替换是最快的.
$stripped=str_replace('www.', '', $domain);
Run Code Online (Sandbox Code Playgroud)
正则表达式替换允许您将该匹配绑定到字符串的开头:
$stripped=preg_replace('/^www\./', '', $domain);
Run Code Online (Sandbox Code Playgroud)
如果它始终是域的第一部分,无论其是否为www,您都可以使用explode/implode.虽然它很容易阅读,但它是效率最低的方法:
$parts=explode('.', $domain);
array_shift($parts); //eat first element
$stripped=implode('.', $parts);
Run Code Online (Sandbox Code Playgroud)
正则表达式可以更有效地实现相同的目标:
$stripped=preg_replace('/^\w+\./', '', $domain);
Run Code Online (Sandbox Code Playgroud)
现在您可能会想到以下内容比上述正则表达式更有效:
$period=strpos($domain, '.');
if ($period!==false)
{
$stripped=substr($domain,$period+1);
}
else
{
$stripped=$domain; //there was no period
}
Run Code Online (Sandbox Code Playgroud)
但我对它进行了基准测试,发现超过一百万次迭代,该preg_replace版本始终如一地击败它.典型结果,归一化为最快(因此它的无单位时间为1):
/^\w+\./:1.494上面的代码示例总是剥离第一个域组件,因此可以在"www.example.com"和"www.example.co.uk"等域上正常工作,但不能"example.com"或"www.department.example" .COM".如果您需要处理可能已经是主域的域,或者有多个子域(例如"foo.bar.baz.example.com")并希望将它们简化为主域("example.com") ,尝试以下.每种方法中的第一个样本仅返回最后两个域组件,因此不适用于"co.uk"类域.
explode:
$parts = explode('.', $domain);
$parts = array_slice($parts, -2);
$stripped = implode('.', $parts);
Run Code Online (Sandbox Code Playgroud)
由于explode始终是最慢的方法,因此编写处理"co.uk"的版本没什么意义.
正则表达式:
$stripped=preg_replace('/^.*?([^.]+\.[^.]*)$/', '$1', $domain);
Run Code Online (Sandbox Code Playgroud)
这将捕获域中的最后两个部分,并用捕获的部分替换完整的字符串值.对于多个子域,所有主要部分都会被剥离.
要使用".co.uk"类域以及可变数量的子域,请尝试:
$stripped=preg_replace('/^.*?([^.]+\.(?:[^.]*|[^.]{2}\.[^.]{2}))$/', '$1', $domain);
Run Code Online (Sandbox Code Playgroud)STR:
$end = strrpos($domain, '.') - strlen($domain) - 1;
$period = strrpos($domain, '.', $end);
if ($period !== false) {
$stripped = substr($domain,$period+1);
} else {
$stripped = $domain;
}
Run Code Online (Sandbox Code Playgroud)
允许co.uk域名:
$len = strlen($domain);
if ($len < 7) {
$stripped = $domain;
} else {
if ($domain[$len-3] === '.' && $domain[$len-6] === '.') {
$offset = -7;
} else {
$offset = -5;
}
$period = strrpos($domain, '.', $offset);
if ($period !== FALSE) {
$stripped = substr($domain,$period+1);
} else {
$stripped = $domain;
}
}
Run Code Online (Sandbox Code Playgroud)通过牺牲边缘情况(其中主域组件是单个字母,例如"a.com"),可以使得基于正则表达式和基于str的实现变得更加快速:
正则表达式:
$stripped=preg_replace('/^.*?([^.]{3,}\.(?:[^.]+|[^.]{2}\.[^.]{2}))$/', '$1', $domain);
Run Code Online (Sandbox Code Playgroud)STR:
$period = strrpos($domain, '.', -7);
if ($period !== FALSE) {
$stripped = substr($domain,$period+1);
} else {
$stripped = $domain;
}
Run Code Online (Sandbox Code Playgroud)虽然行为发生了变化,但排名并非(大部分时间).他们在这里,时间正常化到最快.
在这里,时间之间的差异是如此之小,以至于它并不罕见.例如,快速.co.uk正则表达式经常击败基本的多子域正则表达式.因此,确切的实施不应对速度产生明显影响.相反,选择一个基于简单性和清晰度.只要您不需要处理.co.uk域,那就是多子域正则表达式方法.
| 归档时间: |
|
| 查看次数: |
365 次 |
| 最近记录: |