Как использовать упорядоченный массив в php

0

Я хочу извлечь имя веб-сайта из ссылки, поэтому я пишу следующую функцию:

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, '.'));
        }
    }
}

Проблема в том, что, когда я использую ссылку на веб-сайт I, которая похожа на https://www.github.com, результатом является: s://www, а функция работает только тогда, когда я удаляю этот "www". из списка массивов.

Любые идеи, почему это происходит, или как я могу улучшить эту функцию?

Теги:

3 ответа

1
Лучший ответ

Посмотрите на свой код. Каждый раз, когда вы проходите через foreach, вы каждый раз применяете свою логику с исходного website_link. Это означает, что вы запускаете strlen в ситуации www. после первых двух итераций это происходит:

  1. $prefix - www.
  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) (7 - результат strpos($this->website_name, '.')
  7. Результатом является $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, '.'));

Я бы предложил @dynamic ответ, но если вы хотите продолжить стратегию замены строк, используйте 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, '.'));
  • 0
    во 2, как вы получаете 4 ?, у меня есть $ len = strlen ('https: //'), который является первым элементом префиксов $, поэтому $ this-> website_name должна быть подстрокой от этой позиции до конца, я правильно понял?
  • 0
    @ OussamaELGOUMRI Потому что мы имеем дело с последней итерацией. Смотрите редактирование, я разбил его дальше для вас.
Показать ещё 6 комментариев
2

Вы можете использовать parse_url(); , Пытаться:

print_r(parse_url('https//www.name/'));
  • 0
    хорошо, я попробую, но как насчет вышеупомянутого поведения, почему я получаю этот результат.
  • 0
    @sjagr что ты имеешь ввиду? это именно то, что мне нужно сделать !!
Показать ещё 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));
      }              
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню