2010-01-14 6 views
0

De my related question ici au SO je suis venu avec l'extrait de code PHP suivant:Cet extrait peut-il être optimisé/organisé?

$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; 
} 

Semble un peu hackish, spécialement les if (strlen($result) > $length) en double des blocs de code. Je l'ai envisagé d'abandonner parse_url() tout à fait, mais je veux ignorer le système , utilisateur, passe et le port . Je me demande si vous pouvez trouver une solution plus élégante/organisée qui a le même effet.


Je viens de remarquer, il y a un bug - si $depth != 2 le bloc suivant est affecté:

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

Je pense que la meilleure solution est d'utiliser une boucle, je vais essayer de résoudre ce problème le plus tôt possible . : S


résolu le problème, en le remplaçant par ce nouveau extrait:

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

Répondre

0

Voici la version moins encombrées je suis venu avec:

$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; 
    } 
} 
2

Pour commencer vous pourriez avoir:

if (is_array($url)) 

Répétez l'opération pour tous vos === true opérations. Pourquoi comparez-vous les types?

+0

Il est une habitude, je l'utilise toujours des comparaisons strictes. Fixé maintenant –

Questions connexes