用于解析LDAP dn的正则表达式

时间:2008-09-18 21:21:50

标签: regex

我有以下字符串:

cn=abcd,cn=groups,dc=domain,dc=com

这里可以使用正则表达式在第一个cn=之后和第一个,之前提取字符串吗?在上面的示例中,答案应为abcd

5 个答案:

答案 0 :(得分:12)

 /cn=([^,]+),/ 

大多数语言会将匹配项提取为$ 1或匹配[1]

如果由于某种原因无法使用下标,

$x =~ s/^cn=//
$x =~ s/,.*$//

这是分两步完成的方法。

如果您使用sed

解析日志
sed -n -r '/cn=/s/^cn=([^,]+),.*$/\1/p'    < logfile > dumpfile 

会得到你想要的东西。 (添加额外命令仅打印匹配行)

答案 1 :(得分:6)

/^cn=([^,]+),/

答案 2 :(得分:0)

是的,使用perl / java语法cn=([^,]*),。然后你会得到第一组。

答案 3 :(得分:0)

此外,寻找预先构建的LDAP解析器。

答案 4 :(得分:0)

我必须在PHP中解决这个问题。

由于LDAP字符串有时可能很长并且具有许多属性,因此我想到了如何在项目中使用它。

我想用:

CN=username,OU=UNITNAME,OU=Region,OU=Country,DC=subdomain,DC=domain,DC=com

然后把它变成:

array (
    [CN] => array( username )
    [OU] => array( UNITNAME, Region, Country )
    [DC] => array ( subdomain, domain, com )
)

以下是我构建方法的方法。

/**
 * Read a LDAP DN, and return what is needed
 *
 * Takes care of the character escape and unescape
 *
 * Using:
 * CN=username,OU=UNITNAME,OU=Region,OU=Country,DC=subdomain,DC=domain,DC=com
 *
 * Would normally return:
 * Array (
 *     [count] => 9
 *     [0] => CN=username
 *     [1] => OU=UNITNAME
 *     [2] => OU=Region
 *     [5] => OU=Country
 *     [6] => DC=subdomain
 *     [7] => DC=domain
 *     [8] => DC=com
 * )
 *
 * Returns instead a manageable array:
 * array (
 *     [CN] => array( username )
 *     [OU] => array( UNITNAME, Region, Country )
 *     [DC] => array ( subdomain, domain, com )
 * )
 *
 *
 * @author gabriel at hrz dot uni-marburg dot de 05-Aug-2003 02:27 (part of the character replacement)
 * @author Renoir Boulanger
 * 
 * @param  string $dn          The DN
 * @return array
 */
function parseLdapDn($dn)
{
    $parsr=ldap_explode_dn($dn, 0);
    //$parsr[] = 'EE=Sôme Krazï string';
    //$parsr[] = 'AndBogusOne';
    $out = array();
    foreach($parsr as $key=>$value){
        if(FALSE !== strstr($value, '=')){
            list($prefix,$data) = explode("=",$value);
            $data=preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $data);
            if(isset($current_prefix) && $prefix == $current_prefix){
                $out[$prefix][] = $data;
            } else {
                $current_prefix = $prefix;
                $out[$prefix][] = $data;
            }
        }
    }
    return $out;
}