代码之家  ›  专栏  ›  技术社区  ›  Eddie Awad

解析LDAP DN的正则表达式

  •  4
  • Eddie Awad  · 技术社区  · 16 年前

    我有以下字符串:

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

    这里能否使用正则表达式在第一个字符串之后提取字符串 cn= 在第一次之前 , ?在上面的例子中,答案应该是 abcd .

    5 回复  |  直到 16 年前
        1
  •  12
  •   Kent Fredric    16 年前
     /cn=([^,]+),/ 
    

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

    如果你因为某种原因不能使用下标,

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

    这是一种分两步完成的方法。

    如果你用sed从日志中分析它

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

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

        2
  •  6
  •   shelfoo    16 年前
    /^cn=([^,]+),/
        3
  •  0
  •   sblundy    16 年前

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

        4
  •  0
  •   Joel Coehoorn    16 年前

    另外,寻找一个预构建的LDAP解析器。

        5
  •  0
  •   renoirb    12 年前

    我必须用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;
    }