2013-04-10 4 views
0

Quelle est la meilleure façon de décomposer la chaîne suivante:PHP chaîne de décomposition

$str = '/input-180x129.png' 

Dans ce qui suit:

$array = array(
    'name' => 'input', 
    'width' => 180, 
    'height' => 129, 
    'format' => 'png', 
); 
+0

Est-ce que le résultat doivent être un tableau associatif? – BenM

+0

que diriez-vous de 'explode()'? – Raptor

+0

Quel est votre code actuel? Où êtes-vous coincé? – Jocelyn

Répondre

5

Je voudrais simplement utiliser preg_split pour diviser the string into several variables et put them into an array, si vous devez.

$str = 'path/to/input-180x129.png'; 

// get info of a path 
$pathinfo = pathinfo($str); 
$filename = $pathinfo['basename']; 

// regex to split on "-", "x" or "." 
$format = '/[\-x\.]/'; 

// put them into variables 
list($name, $width, $height, $format) = preg_split($format, $filename); 

// put them into an array, if you must 
$array = array(
    'name'  => $name, 
    'width'  => $width, 
    'height' => $height, 
    'format' => $format 
); 

Après le grand commentaire de Esailija J'ai fait nouveau code qui devrait fonctionner mieux!

Nous obtenons simplement tous les résultats d'un preg_match et faisons à peu près la même chose que sur le code précédent.

$str = 'path/to/input-180x129.png'; 

// get info of a path 
$pathinfo = pathinfo($str); 
$filename = $pathinfo['basename']; 

// regex to match filename 
$format = '/(.+?)-([0-9]+)x([0-9]+)\.([a-z]+)/'; 

// find matches 
preg_match($format, $filename, $matches); 

// list array to variables 
list(, $name, $width, $height, $format) = $matches; 
// ^that's on purpose! the first match is the filename entirely 

// put into the array 
$array = array(
    'name'  => $name, 
    'width'  => $width, 
    'height' => $height, 
    'format' => $format 
); 
+2

Que faire si le nom a 'x'? Ce serait encore sans ambiguïté tant que le nom ne peut pas avoir «-» mais cela échouerait je pense. – Esailija

+0

N'a pas pensé à ça! Va créer un nouveau code ... -beep beep- –

+0

Merci pour la réponse rapide, mais que se passe-t-il si mon $ str est '/directory/subdirectory/anothersubdirectory/input-180x129.png'. Comment obtiendriez-vous seulement le 'input-180x129.png'? –

0

Cela pourrait être une solution stupide & lent, mais il est plus facile à lire:

$str = substr($str, 1);  // /input-180x129.png => input-180x129.png 
$tokens = explode('-', $str); 
$array = array(); 
$array['name'] = $tokens[0]; 
$tokens2 = explode('.', $tokens[1]); 
$array['format'] = $tokens2[1]; 
$tokens3 = explode('x', $tokens2[0]); 
$array['width'] = $tokens3[0]; 
$array['height'] = $tokens3[1]; 
print_r($array); 

// will result: 
$array = array(
    'name' => 'input', 
    'width' => 180, 
    'height' => 129, 
    'format' => 'png', 
); 
+2

Il n'est pas plus facile de lire si vous connaissez juste les bases des expressions régulières. Et si l'on ne sait pas, ils devraient les apprendre et ne pas écrire des montagnes de code pour exprimer quelque chose qui peut être exprimé succinctement par une regex. – Esailija