2010-05-27 4 views
0

J'essaye d'analyser une liste d'instances de système d'exploitation avec leurs identifiants uniques. Je suis à la recherche d'une solution pour analyser une chaîne de texte, et passer les valeurs dans deux variables. La chaîne à analyser est comme suit:Analyseur de chaînes PHP

"Ubuntu 9.10" {40f2324d-a6b2-44e4-90c3-0c5fa82c987d} 
+0

Je pense que vous êtes après preg_split: http://php.net/manual/en/function.preg-split.php – scunliffe

Répondre

2

que je cherchais une excuse pour lire les documents pour sscanf():

sscanf($s, '"%[^"]" {%[^}]}', $os, $ident); 
echo $os, "<br>", $ident; 

followup: Pour l'amour de l'intérêt, des trois réponses actuellement sur cette question:

sscanf: 0.92999792098999 seconds 
preg_match: 4.73761510849 seconds 
str_replace x2 + preg_split: 3.7644839286804 seconds 

Benchmark here. Drôle que deux str_replace() et un preg_split() sont plus rapides que le preg_match().

+0

Nice; Je ne savais même pas que PHP avait 'sscanf()' –

+0

J'ai tendance à utiliser beaucoup printf() et sprintf(), mais je n'ai pas encore utilisé sscanf(). C'est un peu maladroit, en travaillant autour du comportement par défaut de casser à des espaces. –

0

Cela obtient les deux chaînes en tant que premier et second éléments d'un tableau de chaînes en utilisant str_replace et preg_split:

$s = "\"Ubuntu 9.10\" {40f2324d-a6b2-44e4-90c3-0c5fa82c987d}"; 
$s = str_replace("\" ", "|", $s); // substitute middle quotation mark and space for a delimiter 
$s = str_replace("\"", "", $s); // remove quotation marks 
$vars = preg_split('/\|/', $s); // split by delimiter 
print_r($vars); 
+0

'explode()' 'est plus rapide que preg_split()' donné un seul caractère délimiteur . –

1

Vous pouvez utiliser des expressions régulières pour correspondre à la groupes dont vous avez besoin:

$str = '"Ubuntu 9.10" {40f2324d-a6b2-44e4-90c3-0c5fa82c987d}'; 
preg_match('/^"(.*)" {(.*)}$/', $str, $matches); 

vous pouvez faire le plus étroit d'expression régulière en fonction des valeurs (par exemple, le second pourrait être .*[0-9a-f-]+), mais c'est suffisant. $matches[1] sera "Ubuntu 9.10", et $matches[2] sera "40f2324d-a6b2-44e4-90c3-0c5fa82c987d"

+0

+1 pour l'utilisation des groupes de capture regex; si le second '. *' devrait être '[0-9a-f \ -]', non? :) – JYelton

+0

@JYelton Ah, oui, bien que l'évasion ne soit pas techniquement nécessaire. Merci, corrigé –