正则表达式匹配ldap连接字符串

时间:2010-09-21 13:35:52

标签: php regex ldap

我需要从LDAP连接字符串中提取信息,如下所示:

ldap://uid=adminuser,dc=example,c=com:secret@ldap.example.com/dc=basePath,dc=example,c=com

我想使用一个正则表达式,它将为我提取每个标记并将其放在一个数组中。我尝试了一些正则表达式,我得到的最好的是:

/(\w+)\:\/\/(([a-zA-Z0-9]+)(:([^\:\@]+))?@)?([^\/]+)((\/[^#]*)?(#(.*))?)/

但不幸的是,当我在PHP中执行它时,我得到以下结果:

Array
(
    [0] => ldap://uid=adminuser,dc=example,c=com:secret@ldap.example.com/dc=basePath,dc=example,c=com
    [1] => ldap
    [2] => 
    [3] => 
    [4] => 
    [5] => 
    [6] => uid=adminuser,dc=example,c=com:secret@ldap.example.com
    [7] => /dc=basePath,dc=example,c=com
    [8] => /dc=basePath,dc=example,c=com
)

任何人都可以帮助我,以便我可以正确提取连接字符串的每个部分吗?

由于

1 个答案:

答案 0 :(得分:5)

([a-zA-Z0-9]+)似乎不足以获取包含=和其他字符的LDAP字符串。

一般情况下,您不应尝试使用正则表达式自行解析URL。而是使用标准库函数parse_url()

这给出了:

array(5) {
  ["scheme"]=>
  string(4) "ldap"
  ["host"]=>
  string(16) "ldap.example.com"
  ["user"]=>
  string(30) "uid=adminuser,dc=example,c=com"
  ["pass"]=>
  string(6) "secret"
  ["path"]=>
  string(29) "/dc=basePath,dc=example,c=com"
}