2009-07-17 3 views
1

Ce que je dois faire est de changer une chaîne comme "CN = bobvilla, OU = Personnes, DC = exemple, DC = com" (peut avoir beaucoup de DC = dans la chaîne) à "example.com"Comment puis-je extraire des domaines complets à partir de champs LDAP?

J'ai cette méthode, mais il me semble bâclé et je voulais voir si quelqu'un avait une meilleure idée.

my $str = "CN=bobvilla, OU=People, DC=example, DC=com"; 
print "old: $str\n"; 
while($str =~ s/DC=([^,]+)//) 
{ 
    $new_str .= "$1."; 
} 
$new_str =~ s/\.$//; 
print "new: $new_str\n"; 

grâce ~

Répondre

4

Il est relativement simple:

my $str = "CN=bobvilla, OU=People, DC=example, DC=com"; 
print "old: $str\n"; 

C'était directement de la question.

Maintenant, nous avons besoin de tous les contrôleurs de domaine:

my @DCs = $str =~ m/DC=([^\s,]+)/g; 

Associez-le en résultat et impression:

my $new_str = join '.', @DCs; 
print "new: $new_str\n"; 

entier "programme":

my $str = "CN=bobvilla, OU=People, DC=example, DC=com"; 
print "old: $str\n"; 

my @DCs = $str =~ m/DC=([^\s,]+)/g; 
my $new_str = join '.', @DCs; 

print "new: $new_str\n"; 
1

Cela devrait faire le travail:

my $str = "DC=example, DC=com"; 
$str =~ s/DC=//g; 
$str =~ s/,\s/./g; 
print "new: $str\n"; 
+0

Aurait des ennuis si vous aviez un autre ", " match en dehors des champs DC – nik

+0

Vérifiez ma modification, j'ai oublié d'inclure quelque chose – user105033

+0

Ah, les champs qui n'existaient pas dans l'échantillon original – Quentin

1

est ici une façon

my $str = "CN=bobvilla, OU=People, DC=example, DC=com"; 
@s = split /,\s+/ , $str; 
foreach my $item (@s){ 
    if (index($item,"DC") == 0) {   
     $item = substr($item,3); 
     push(@i , $item) 
    } 
} 
print join(".",@i); 
+0

c'est correct pour un LDAP chaîne de liaison. – nik

0

Dans un seul regex:

$str =~ s/(?:^|(,)\s+)(?:.(?<!\sDC=))*?DC=(?=\w+)|[,\s]+.*$|^.*$/$1&&'.'/ge; 
Questions connexes