将匹配的组值分配给php中的变量

时间:2010-07-05 12:34:21

标签: php

使用php如何将用户名,密码,数据库名,主机名等拆分为变量。

例如:

  

$ db =   “数据库名称://用户名:密码@主机名/ DBNAME”

     

$   databasename = databasename

     

$ user = username

     

$ pass =密码

     

$ host = hostname

     

$ dbname = dbname

我尝试过在正则表达式中进行分组。但我不知道如何将组值分配到变量中。

  

的preg_match(“(^([AZ] )://([AZ] ):???([AZ] )@ ​​[AZ] ) /([az] *?)$)“,$ db,$ matches);

4 个答案:

答案 0 :(得分:1)

看看

 print_r($matches);
成功比赛后

它应该变得清晰。

来自php docs http://pl2.php.net/preg_match

  

如果提供了匹配,那么   它充满了结果   搜索。 $ matches [0]将包含   与完整模式匹配的文本,   $ matches [1]将有文本   匹配第一个捕获   带括号的子模式,依此类推。

答案 1 :(得分:1)

您可以执行以下操作:

$db = "databasename://username:password@hostname/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);

给出:

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

或者您可以使用命名组。

答案 2 :(得分:1)

您必须选择一个分隔符(通常是一个不与表达式一起使用的字符)。表达式应以分隔符开头和结尾,您可以选择在结束分隔符后附加标志。 E.g:

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

您应该考虑扩大大多数字符范围:用户名可以包含数字,密码几乎可以包含任何内容。

我认为如果相应的参数是可选的,字符串(://@ ...)中的分隔符不一定存在。

最后但并非最不重要的是,正如Kamil Szot已经指出的那样,括号内的匹配被加载到$ matches变量中。

答案 3 :(得分:1)

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

php > print_r($matches);

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