Я хочу извлечь имя веб-сайта из ссылки, поэтому я пишу следующую функцию:
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". из списка массивов.
Любые идеи, почему это происходит, или как я могу улучшить эту функцию?
Посмотрите на свой код. Каждый раз, когда вы проходите через 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, '.'));
Я бы предложил @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, '.'));
Вы можете использовать parse_url();
, Пытаться:
print_r(parse_url('https//www.name/'));
Да, используйте 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));
}
}
}