过滤字符串中的单词

时间:2017-03-07 10:07:46

标签: php ldap filtering string-search

我使用PHP在Active Directory中查询用户及其属性。我遇到的问题是,部门经理的LDAP字段不仅返回用户名,还返回FQDN(完全限定域名)路径,如下所示:

CN=User Name,OU=Users,OU=companyBranchOffice,OU=companyName,DC=subdomain,DC=domain,DC=com

结果保存在字符串$ depManager中。如何仅过滤掉用户名(CN =)?

提前致谢!

3 个答案:

答案 0 :(得分:0)

有一个简单的(可能没有优化的)函数来从DN获取信息:

<?php
function getInfosFromDN($dn)
{
    $regexCaptures = "/^(CN=.+),(OU=.+),(DC=.+)$/iU";

    $CN = preg_replace($regexCaptures, "$1", $dn);
    $OU = preg_replace($regexCaptures, "$2", $dn);
    $DC = preg_replace($regexCaptures, "$3", $dn);

    return array($CN, $OU, $DC);
}

list($CN, $OU, $DC) = getInfosFromDN("CN=User Name,OU=Users,OU=companyBranchOffice,OU=companyName,DC=subdomain,DC=domain,DC=com");

答案 1 :(得分:0)

我想你现在正在使用ldap_get_entries来提取sn / cn / ou / uid属性? 可能你可以尝试其他的(取决于你的配置,可能是uid)只获得真正的用户名。无需preg_replacing。

示例:

$sr = ldap_search($ds, $dn, $filter) or die ("bummer");
$results = ldap_get_entries($ds, $sr);
var_dump($results);

现在,您可以查看数据库中是否存在仅包含用户名的值的属性,而不是整个DN。如果这不起作用,你可以像Guillaume建议的那样手动完成。

答案 2 :(得分:0)

你有不同的选择。

  • 第一个选项是执行单独的LDAP查询以获取给定DN的LDAP条目并从中检索Users用户名
  • 然后,您可以使用PHPs字符串函数或正则表达式解析字符串,以在CN=,
  • 之间获取部分
  • 或者你可以使用f.e. Zend\Ldap\Dn喜欢这样:

    $dn = new \Zend\Ldap\Dn('CN=User Name,OU=Users,OU=companyBranchOffice,OU=companyName,DC=subdomain,DC=domain,DC=com');
    echo current($dn->get(0));
    // $dn->get(0) will return ['cn' => 'User Name']
    // so current($dn->get(0)) will return 'User Name'
    

免责声明:我是Zend \ Ldap

的维护者之一