我想从链接中提取网站名称,因此我编写了以下函数:
protected function getWebsiteName()
{
$prefixs = ['https://', 'http://', 'www.'];
foreach($prefixs as $prefix)
{
if(strpos($this->website_link, $prefix) !== false)
{
$len = strlen($prefix);
$this->website_name = substr($this->website_link, $len);
$this->website_name = substr($this->website_name, 0, strpos($this->website_name, '.'));
}
}
}
问题在于,当我使用看起来像 https://www.github.com 的网站链接时,结果是: s:// www ,仅限功能当我删除那个' www。'从数组列表。
为什么会发生这种情况,或者我如何改进这项功能?
答案 0 :(得分:2)
您可以使用parse_url();
,尝试:
print_r(parse_url('https//www.name/'));
答案 1 :(得分:1)
让我们来看看你的代码。每次通过foreach
,时,您每次都会使用原始website_link
的逻辑。这意味着当您在前两次迭代后在strlen
的情况下运行www.
时,会发生这种情况:
$prefix
是www.
$len = 4
($prefix
的长度)$this->website_link
仍然是https://www.github.com
substr($this->website_link, 4)
$this->website_name = 's://www.github.com'
substr($this->website_name, 0, 7)
7
是strpos($this->website_name, '.')
$this->website_name = 's://www'
要解决此问题,您应将$this->website_link
保存到$temp
,然后使用以下代码:
$temp = $this->website_link;
foreach($prefixs as $prefix)
{
if(strpos($temp, $prefix) !== false)
{
$len = strlen($prefix);
$temp = substr($temp, $len);
}
}
$this->website_name = substr($temp, 0, strpos($temp, '.'));
我建议使用@vynamic的答案,但如果你想继续使用字符串替换策略,请使用str_replace
。它接受针的数组!
$prefixes = ['https://', 'http://', 'www.'];
$this->website_name = str_replace($prefixes, '', $this->website_link);
$this->website_name = substr($this->website_name, 0, strpos($this->website_name, '.'));
答案 2 :(得分:0)
是的,使用parse_url和preg_match应该完成工作
function getWebsiteName($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;
}
这是修复你的代码。
function getWebsiteName()
{
$this->website_name = $this->website_link;
$prefixs = array('https://', 'http://', 'www.');
foreach($prefixs as $prefix)
{
if (substr($this->website_name, 0, strlen($prefix)) == $prefix) {
$this->website_name = substr($this->website_name, strlen($prefix));
}
}
}