2010-07-05 3 views
0

Utiliser php pour diviser les noms d'utilisateur, les mots de passe, le nom de données, le nom d'hôte, etc. en une variable.affecter une valeur de groupe correspondante dans la variable en php

Par exemple:

$ db = "databasename: // nom d'utilisateur: mot de passe @ nom d'hôte/dbname"

$ databasename = databasename

$ user = nom d'utilisateur

$ pass = mot de passe

$ host = hostn amme

$ dbname = dbname

J'ai essayé avec le regroupement dans l'expression régulière. mais je ne sais pas comment affecter les valeurs du groupe dans la variable.

preg_match ("(^ ([az] ): // ([az]): ([az] ) @ [az])/([az] *?) $) ", $ db, $ correspond à);

Répondre

1

Vous pouvez faire quelque chose comme:

$db = "databasename://username:[email protected]/dbname"; 
if (preg_match("~^([a-z]+)://([a-z]+):([a-z]+)@[a-z]+/([a-z]+)\$~i", 
     $db , $matches)) 
    list($ignore, $databasename, $username, $password, $dbname) = $matches; 

var_dump($databasename); 
var_dump($username); 
var_dump($password); 
var_dump($dbname); 

qui donne:

string(12) "databasename" 
string(8) "username" 
string(8) "password" 
string(6) "dbname" 

Vous pouvez également utiliser des groupes nommés.

+0

mon entrée peut être ce $ db = "databasename: // nom d'utilisateur: mot de passe @ nom d'hôte/dbname"; [ou] this $ db = "nom de la base de données: // nom d'utilisateur: [email protected]/dbname"; pour cela j'ai écrit l'expression régulière comme ceci. if (preg_match ("~^([a-zA-Z] +): // ([a-zA-Z] +): ([a-zA-Z] +) @ ([az] | ([ 0-9] {1,3} [.] [0-9] {1,3} [.] [0-9] {1,3} [.] [0-9] {1,3})) +/([az] +) \ $ ~ i ", $ db, $ correspond à) [0] => pgsql: // sugumar: [email protected]/sugumar [1] => pgsql [2] => Sugumar [3] => Sugumar [4] => 192.168.12.130 [5] => 192.168.12.130 [6] => Sugumar pourquoi l'indice 4 et 5 sont les mêmes. – ungalnanban

+0

@ung Parce que vous avez utilisé deux groupes ... Vous pouvez utiliser '(?: Quelque chose ici)' au lieu de '(quelque chose ici)' pour les groupes qui ne capturent pas. – Artefacto

1

Regardez

print_r($matches); 

après un match réussi. Cela devrait devenir clair.

De php docs ici http://pl2.php.net/preg_match:

Si des correspondances est fourni, il est rempli avec les résultats de la recherche . $ matches [0] contiendra le texte correspondant au modèle complet, $ correspond au texte que a apparié au premier sous-modèle parenthèse capturé, et ainsi de suite.

+0

est erroné. – fabrik

+0

preg_match ("([a-zA-Z] *?): // ([a-zA-Z] *?): ([A-zA-Z] *?) @ ([A-zA-Z]) *?)/([a-zA-Z] *?) $ ", $ DB, $ correspond à); L'expression régulière ci-dessus est mon code actuel. print_r montre l'erreur suivante Attention: preg_match(): modificateur inconnu ':' Je – ungalnanban

+0

posté droit regexp beugler – ivan73

1

Vous devez choisir un délimiteur (généralement, un caractère qui n'est pas utilisé avec l'expression). L'expression doit commencer et se terminer par le délimiteur et vous pouvez éventuellement ajouter des drapeaux après le délimiteur de fermeture. .: par exemple

preg_match("~(^([a-z]?)://([a-z]?):([a-z]?)@[a-z]?)/([a-z]*?)$)~i", $db , $matches); 

Vous devriez envisager d'élargir gammes caractère le plus: un nom d'utilisateur peut contenir des chiffres et un mot de passe peut contenir presque tout.

Je suppose que les délimiteurs de la chaîne (:, //, @ ...) ne seront pas nécessairement présents si les paramètres correspondants sont facultatifs.Comme le soulignait déjà Kamil Szot, les correspondances entre parenthèses sont chargées dans la variable $ matches.

1

php > preg_match("#([a-z]+)://([a-z]+):([a-z]+)@([a-z]+)/([a-z]+)$#", $var , $matches);

php > print_r($matches);

Array ( [0] => databasename://username:[email protected]/dbname [1] => databasename [2] => username [3] => password [4] => hostname [5] => dbname )

modèle
+0

Désolé remplacer $ var avec $ db dans votre cas .. ça marche :) – ivan73

Questions connexes