如何在php中使用有序数组

时间:2014-11-18 21:29:52

标签: php

我想从链接中提取网站名称,因此我编写了以下函数:

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。'从数组列表。

为什么会发生这种情况,或者我如何改进这项功能?

3 个答案:

答案 0 :(得分:2)

您可以使用parse_url();,尝试:

print_r(parse_url('https//www.name/'));

答案 1 :(得分:1)

让我们来看看你的代码。每次通过foreach时,您每次都会使用原始website_link的逻辑。这意味着当您在前两次迭代后在strlen的情况下运行www.时,会发生这种情况:

  1. $prefixwww.
  2. 因此,$len = 4$prefix的长度)
  3. $this->website_link仍然是https://www.github.com
  4. 您申请substr($this->website_link, 4)
  5. 结果为$this->website_name = 's://www.github.com'
  6. 您申请substr($this->website_name, 0, 7) 7strpos($this->website_name, '.')
  7. 的结果
  8. 结果为$this->website_name = 's://www'
  9. 要解决此问题,您应将$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));
      }              
    }
}