2011-03-11 7 views
0

J'ai une chaîne qui ressemble à:chaîne php analyse syntaxique à un tableau

'- 10 TEST (FOO 3 TEST.BAR 213 BAZ (\HELLO) TEST' 

Même format pour toute autre chaîne. Comment pourrais-je obtenir, la valeur de FOO, BAR et BAZ. Ainsi, par exemple, je peux obtenir un tableau comme:

'FOO' => 3, 
'BAR' => 213, 
'BAZ' => HELLO 
+2

expliquer le modèle de chaîne s'il vous plaît – amosrivera

+0

Quel genre de logique était/est derrière la connexion entre les clés et les valeurs ??? – powtac

+0

motif est fondamentalement comme: '(Valeur CONST X.CONST valeur CONST (\ VALUE) X ...)', où 'CONST' est le placer hoder dans ce cas (ne change jamais) – CalebW

Répondre

0

En supposant ni les constantes ni les valeurs ont un espace en eux, cela fonctionnera pour l'exemple donné:

$str = '(CONST1 value1 X.CONST2 value2 CONST3 (\VALUE3) X...)'; 
preg_match('/\((\S+)\s+(\S+)\s+.*?\.(\S+)\s+(\S+)\s+(\S+)\s+\(\\\\(\S+)\)/', $str, $m); 
$arr = array(); 
for($i=1; $i<count($m);$i+=2) { 
    $arr[$m[$i]] = $m[$i+1]; 
} 
print_r($arr); 

sortie:

Array 
(
    [CONST1] => value1 
    [CONST2] => value2 
    [CONST3] => VALUE3 
) 

explication

\(   : an open parenthesis 
(\S+)  : 1rst group, CONST1, all chars that are not spaces 
\s+   : 1 or more spaces 
(\S+)  : 2nd group, value1 
\s+.*?\. : some spaces plus any chars plus a dot 
(\S+)  : 3rd group, CONST2 
\s+   : 1 or more spaces 
(\S+)  : 4th group, value2 
\s+   : 1 or more spaces 
(\S+)  : 5th group, CONST3 
\s+   : 1 or more spaces 
\(   : an open parenthesis 
\\\\  : backslash 
(\S+)  : 6th group, VALUE3 
\)   : a closing parenthesis 
+0

parfait, merci! – CalebW

+0

De rien. – Toto

3

preg_match est votre ami :)

+0

Je pense que cette réponse est un peu trop vague (comme c'est la question). Au lieu d'un conseil spécifique, voici quelques outils qui pourraient aider OP avec son problème: http://stackoverflow.com/questions/89718/is-there-anything-like-regexbuddy-in-the-open-source-world – mario

1

Vous voulez utiliser preg_match d'abord saisir les matchs, puis les mettre dans un tableau. Cela vous donnera ce que vous cherchez:

$str = '- 10 TEST (FOO 3 TEST.BAR 213 BAZ (\HELLO) TEST'; 

preg_match('/FOO (\d+).+BAR (\d+).+BAZ \(\\\\(\w+)\)/i', $str, $match); 

$array = array(
    'FOO' => $match[1], 
    'BAR' => $match[2], 
    'BAZ' => $match[3] 
); 

print_r($array); 

Cela suppose cependant que les deux premières valeurs sont des nombres et le dernier mot est caractères.