PHP Conference Japan 2024

ldap_explode_dn

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_explode_dn將 DN 分割為其組成部分

描述

ldap_explode_dn(string $dn, int $with_attrib): array|false

分割由 ldap_get_dn() 傳回的 DN,並將其分解為組成部分。每個部分稱為相對識別名稱 (Relative Distinguished Name),或 RDN。

參數

dn

LDAP 實體的識別名稱。

with_attrib

用於要求 RDN 傳回時只帶值,還是同時帶屬性。若要取得帶屬性的 RDN (即,以 attribute=value 格式),請將 with_attrib 設定為 0;若只取得值,則設定為 1。

傳回值

傳回所有 DN 組件的陣列,失敗時傳回 false。陣列中的第一個元素具有 count 鍵,代表傳回值的數量,下一個元素是數值索引的 DN 組件。

新增附註

使用者提供的附註 6 個附註

3
eero at eero dot info
7 年前
我正在將 LDAP 相關程式碼轉換為 PHP7,PHP7 不再支援 preg_replace 的 /e 修飾符,而是應使用 preg_replace_callback。這可能會對處理相同問題的人有所幫助

<?php

$value
= 'Universität';

# < PHP7 相容程式碼
echo preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value);

# >= PHP7 相容程式碼
echo preg_replace_callback('/\\\([0-9A-Fa-f]{2})/', function ($matches) { return chr(hexdec($matches[1])); }, $value);
4
gabriel at hrz dot uni-marburg dot de
21 年前
請注意 UTF8 編碼的 DN。自 openLDAP >=2.1.2
ldap_explode_dn 會將無法列印的字元(在 ASCII 的意義上,UTF8
編碼)轉換為 \<hexcode>。

範例

$dn="ou=Universität ,c=DE";
var_dump(ldap_explode_dn($dn,0));

//傳回

array(3) {
["count"]=>
int(2)
[0]=>
string(19) "ou=Universit\C3\A4t"
[1]=>
string(4) "c=DE"
}

不幸的是,PHP 不支援 ldap 函式 ldap_str2dn 和
ldap_dn2str,但透過 preg_replace 可以使用一個變通方法
復原 ldap_explode_dn 的舊行為

// 變通方法
function myldap_explode_dn($dn,$with_attribute){

$result=ldap_explode_dn ($dn, $with_attrib);
//將十六進位碼再次翻譯為 ascii
foreach($result as $key=>$value){
$result[$key]=preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value);
}
return($result);

}
//
//接著是範例

$dn="ou=Universität ,c=DE";
var_dump(myldap_explode_dn($dn,0));

//傳回

array(3) {
["count"]=>
int(2)
[0]=>
string(15) "ou=Universität"
[1]=>
string(4) "c=DE"
}
3
hello+php at NOSPAM dot renoirboulanger dot com
12 年前
我來到這個頁面並很欣賞這些評論。

由於 LDAP 字串有時可能很長且有很多屬性,我需要能夠對其中所有內容進行排序。

在我的情況下,我需要取得子網域部分和其他參數。

以下是我建構方法的方式。
<?php
/**
* 剖析 DN 字串並將其格式化為陣列
*
* 讀取 LDAP DN,並傳回一個陣列索引鍵
* 列出所有相似的屬性。
*
* 也會處理字元跳脫和取消跳脫
*
* 範例:
* CN=username,OU=UNITNAME,OU=Region,OU=Country,DC=subdomain,DC=domain,DC=com
*
* 通常會傳回:
* Array (
* [count] => 9
* [0] => CN=username
* [1] => OU=UNITNAME
* [2] => OU=Region
* [5] => OU=Country
* [6] => DC=subdomain
* [7] => DC=domain
* [8] => DC=com
* )
*
* 改為傳回可管理的陣列:
* 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 (字元取代的一部分)
* @author Renoir Boulanger
*
* @param string $dn 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;
}
?>
0
emepese
7 年前
這可能不是最好的方法,但對於那些正在尋找一種在不帶 "cn=" 部分的情況下取得 DN 的 CN 的人來說,這是一個帶有正規表示式模式的函式

<?php
function getCNofDN($dn) {
$return=preg_match('/[^cn=]([^,]*)/i',$dn,$dn);
return(
$dn[0]);
}

echo
getCNofDN("cn=emepese,cn=someLevel,dc=someCompany");

// Will print "emepese"

?>
0
DavidSmith at byu dot net
21 年前
[ 編輯者註:此段錯誤已修復,在 PHP 4.3.4 或 PHP 5.0.0 發佈時將不會發生。然而,如下文所述,逸出特殊字元仍然很重要。]

如果您的 DN 包含 < 或 > 字元,您必須使用反斜線逸出它們,否則 ldap_explode_dn() 將會給您「參數計數錯誤」或是甚至產生區段錯誤。

舉例來說,以下呼叫會失敗,並出現「參數計數錯誤」或是區段錯誤

ldap_explode_dn( "cn=<bob>,dc=example,dc=com", 0 );
ldap_explode_dn( 'cn=<bob>,dc=example,dc=com', 0 );

但這樣會成功

ldap_explode_dn( "cn=\<bob\>,dc=example,dc=com", 0 );

另請注意,< 和 > 會如上述使用十六進制代碼逸出。這個函式是一個不錯的包裝器,可以正確格式化所有 DN,並且可以安全地使用 < 和 > 字元以及 UTF-8 字元呼叫。

function my_explode_dn( $dn, $with_attributes=0 )
{
$dn = addcslashes( $dn, "<>" );
$result = ldap_explode_dn( $dn, $with_attributes );
//將十六進位碼再次翻譯為 ascii
foreach( $result as $key => $value )
$result[$key] = preg_replace("/\\\([0-9A-Fa-f]{2})/e", "''.chr(hexdec('\\1')).''", $value);
return $result;
}

我正在使用 php 4.3.1。祝您好運!
0
bs at muekno dot de
23 年前
複製比打字好多了!!!!
只需修改常數。
祝您一切順利(並感謝這個有用的網站),
Bernd Schwaegerl
Mueller-Knoche GmbH,系統整合服務供應商

# 範例

$HOST = "您的主機名稱";
$USER_DN = "您的 LDAP 使用者 DN";
$PWD = "Ldapuserpassword";
$BASE_DN = "o=您的組織";
$SEARCH_OBJECT="sn=您的搜尋人物物件 SN";

$ldap_handle=ldap_connect($HOST);
$bind_result=ldap_bind($ldap_handle,$USER_DN,$PWD);

$search_result=ldap_search($ldap_handle,$BASE_DN,$SEARCH_OBJECT);
$result=ldap_get_entries($ldap_handle,$search_result);
$result_array=ldap_get_entries($ldap_handle,$result);
$whole_dn=$result_array[0]["dn"];

$dn_parts=ldap_explode_dn($whole_dn,0);
To Top