2009-06-08 7 views
1

J'ai une très longue chaîne dans un certain modèle tel que userAccountName: abc userCompany: xyz userEmail: [email protected] userAddress1: userAddress2: userAddress3: userTown: ..... et ainsi de suite. Ce motif se répète.Traitement d'une chaîne dans php

J'ai besoin de trouver un moyen de traiter cette chaîne de manière à avoir les valeurs de userAccountName :, userCompany: etc. (c'est-à-dire de préférence dans un tableau associatif ou un format pratique).

Existe-t-il un moyen facile de le faire ou devrais-je écrire ma propre logique pour diviser cette chaîne en différentes parties?

+1

Vous devrez certainement écrire votre propre logique. Il n'y a pas de fonction intégrée pour faire ce que vous voulez. –

Répondre

2

Des expressions régulières simples telles que userAccountName:\s*(\w+)\s+ peuvent être utilisées pour capturer des correspondances, puis utiliser les correspondances capturées pour créer une structure de données.

2

Si vous pouvez faire en sorte que les données soient formatées comme dans une URL (var = data & var2 = data2), vous pouvez utiliser parse_str, qui fait exactement ce que vous voulez, je pense. Certains managements de vos données d'entrée le feraient d'une manière directe.

1

Vous devrez peut-être utiliser regex ou votre propre logique.

Êtes-vous garanti que la chaîne ":" n'apparaît nulle part dans les valeurs elles-mêmes? Si c'est le cas, vous pouvez éventuellement utiliser implode pour diviser la chaîne en un tableau de clés et de valeurs en alternance. Vous devrez alors parcourir ce tableau et le formater comme vous le souhaitez. Voici une rude (probablement inefficace) par exemple j'ai jeté ensemble rapidement:

<?php 
$keysAndValuesArray = implode(': ', $dataString); 
$firstKeyName = 'userAccountName'; 
$associativeDataArray = array(); 
$currentIndex = -1; 
$numItems = count($keysAndValuesArray); 
for($i=0;$i<$numItems;i+=2) { 
    if($keysAndValuesArray[$i] == $firstKeyName) { 
     $associativeDataArray[] = array(); 
     ++$currentIndex; 
    } 
    $associativeDataArray[$currentIndex][$keysAndValuesArray[$i]] = $keysAndValuesArray[$i+1]; 
} 

var_dump($associativeDataArray); 
1

Si vous pouvez écrire une expression rationnelle (par mon exemple, je songe à me il ne sommes pas dans les valeurs des points-virgules), vous pouvez analyser avec preg_split ou preg_match_all comme ceci:

<?php 

    $raw_data = "userAccountName: abc userCompany: xyz"; 
    $raw_data .= " userEmail: [email protected] userAddress1: userAddress2: "; 

    $data = array(); 
    // /([^:]*\s+)?/ part works because the regexp is "greedy" 
    if (preg_match_all('/([a-z0-9_]+):\s+([^:]*\s+)?/i', $raw_data, 
        $items, PREG_SET_ORDER)) { 
    foreach ($items as $item) { 
     $data[$item[1]] = $item[2]; 
    } 
    print_r($data); 
    } 

?> 

Si ce n'est pas le cas, s'il vous plaît décrire la grammaire de votre chaîne dans un peu plus en détail.

+0

Est-ce que [^:] ne saisira pas trop de "label"? – PatrikAkerstrand

+0

Oui, désolé, je ne l'ai pas remarqué. Je vais éditer le post avec une solution plus appropriée (en utilisant preg_match_all, pas preg_split). Avoir à penser plus et revérifier tout avant de poster ... – drdaeman

0

PCRE est inclus dans PHP et peut répondre à vos besoins en utilisant regexp comme:

if ($c=preg_match_all ("/userAccountName: (<userAccountName>\w+) userCompany: (<userCompany>\w+) userEmail: /", $txt, $matches)) 
{ 
    $userAccountName = $matches['userAccountName']; 
    $userCompany = $matches['userCompany']; 
    // and so on... 
} 

le plus difficile est d'obtenir le bon regexp pour vos besoins. vous pouvez jeter un oeil à http://txt2re.com pour de l'aide

0

Si j'étais vous, je vais essayer de convertir les chaînes au format json avec un peu d'expression rationnelle.

Ensuite, utilisez simplement Json.