이 스 니펫이 더욱 최적화 / 구성 할 수 있습니까?
문제
에서 내 관련 질문 여기에서 나는 다음 PHP 스 니펫을 생각해 냈습니다.
$url = parse_url($url);
if (is_array($url))
{
$depth = 2;
$length = 50;
if (array_key_exists('host', $url))
{
$result = preg_replace('~^www[.]~i', '', $url['host']);
if (array_key_exists('path', $url))
{
$result .= preg_replace('~/+~', '/', $url['path']); // normalize a bit
}
if (array_key_exists('query', $url))
{
$result .= '?' . $url['query'];
}
if (array_key_exists('fragment', $url))
{
$result .= '#' . $url['fragment'];
}
if (strlen($result) > $length)
{
$result = implode('/', array_slice(explode('/', $result, $depth + 2), 0, $depth + 1)) . '/';
if (strlen($result) > $length)
{
$result = implode('/', array_slice(explode('/', $result, $depth + 1), 0, $depth + 0)) . '/';
}
$result = substr($result, 0, $length) . '...';
}
}
return $result;
}
특히 해킹 된 것 같습니다. 특히 복제품입니다 if (strlen($result) > $length)
코드 블록. 나는 떨어지는 것을 고려했다 parse_url()
모두이지만 무시하고 싶습니다 계획, 사용자, 통과하다 그리고 포트.
당신이 같은 효과를 가진 더 우아하고 조직 된 솔루션을 만들 수 있는지 궁금합니다.
방금 알아 차렸다. 버그가있다. $depth != 2
다음 블록이 영향을받습니다.
if (strlen($result) > $length)
{
$result = implode('/', array_slice(explode('/', $result, $depth + 2), 0, $depth + 1)) . '/';
if (strlen($result) > $length)
{
$result = implode('/', array_slice(explode('/', $result, $depth + 1), 0, $depth + 0)) . '/';
}
$result = substr($result, 0, $length) . '...';
}
최선의 해결책은 루프를 사용하는 것입니다. 최대한 빨리이 문제를 해결하려고 노력할 것입니다. :에스
이 새로운 스 니펫으로 교체하여 해결했습니다.
if (strlen($result) > $length)
{
for ($i = $depth; $i > 0; $i--)
{
$result = implode('/', array_slice(explode('/', $result), 0, $i + 1)) . '/';
if (strlen($result) <= $length)
{
break;
}
}
$result = substr($result, 0, $length) . '...';
}
해결책 2
다음은 내가 생각해 낸 덜 혼란스러운 버전입니다.
$url = preg_replace('~^www[.]~i', 'http://www.', array_shift($url));
$parts = parse_url($url);
if (is_array($parts))
{
$depth = 2;
$length = 50;
if (array_key_exists('host', $parts))
{
$result = preg_replace('~^www[.]~i', '', $parts['host']);
if (array_key_exists('path', $parts))
{
$result .= preg_replace('~/+~', '/', $parts['path']);
}
if (array_key_exists('query', $parts))
{
$result .= '?' . $parts['query'];
}
if (array_key_exists('fragment', $parts))
{
$result .= '#' . $parts['fragment'];
}
if (strlen($result) > $length)
{
while ($depth > 0)
{
$result = implode('/', array_slice(explode('/', $result), 0, $depth-- + 1)) . '/';
if (strlen($result) <= $length)
{
break;
}
}
$result = substr($result, 0, $length) . '...';
}
return $result;
}
}
다른 팁
우선 초보자를 위해 :
if (is_array($url))
당신의 모든 것에 대해 반복하십시오 === true
운영. 유형을 비교하는 이유는 무엇입니까?
제휴하지 않습니다 StackOverflow