2012-07-10 85 views
1
$LDAP = ldap://sspdir.managed.entrust.com/ou=Entrust Managed Services SSP CA,ou=Certification Authorities,o=Entrust,c=US?cACertificate;binary,crossCertificatePair;binary 

我想从此代码ldap目录中提取2个字符串。首先我想:Perl正则表达式替换并保存到变量

$LDAP_host = sspdir.managed.entrust.com 

和第二...

$LDAP_base = ou=Entrust Managed Services SSP CA,ou=Certification Authorities,o=Entrust,c=US 

我的代码如下,它在我的输出端产生恒定的错配和我想不通为什么:

my $LDAP_host = $LDAP; 
my $LDAP_base = $LDAP; 
$LDAP_host =~ s|^ldap:\/\/(.*)\/|$1|i; 
$LDAP_base =~ s|"\/"(.*)\?|$1|i; 
+0

如果这是一个LDAP字符串,应该有合适的模块来解析它。 – TLP 2012-07-10 18:27:47

回答

0

这应该做你想做的事:

my $LDAP_host = $LDAP; 
my $LDAP_base = $LDAP; 
$LDAP_host =~ s|^ldap:\/\/(.*)\/.*|$1|i; 
$LDAP_base =~ s|^ldap:\/\/.*\/(.*)\?.*|$1|i; 
+0

谢谢你的完美工作! – eagles02 2012-07-10 18:11:20

3

我会使用:

my ($LDAP_host, $LDAP_base) = $LDAP=~ m{ // ([^/]+)/(ou=[^?]+) }x; 

或者,如果你想查询字符串的开头太:

my ($LDAP_host, $LDAP_base) = $LDAP=~ m{ ^ldap:// ([^/]+)/(ou=[^?]+) \? }x; 

问候

RBO

1
my $str = "ldap://sspdir.managed.entrust.com/ou=Entrust Managed Services SSP CA,ou=Certification Authorities,o=Entrust,c=US?cACertificate;binary,crossCertificatePair;binary"; 
my ($LDAP_host, $LDAP_base) = ($str =~ m!ldap://([^/]+)/([^?]+)!); 
print "$LDAP_host $LDAP_base\n"; 
0

如果你不想改变原来的字符串,你可以试试这个:

my ($host) = $LDAP =~ /^ldap:\/\/(.*)\//i; 

此外,如果您在搜索中使用//以外的分隔符并替换,则 不需要转义正斜杠。

$LDAP_host =~ s{^ldap://(.*)/.*}{$1}i; 
1

产生

sspdir.managed.entrust.com 
ou=Entrust Managed Services SSP CA,ou=Certification Authorities,o=Entrust,c=US 
0

请在下面找到实现用perl相同的电枢方式。

my $LDAP = "ldap://sspdir.managed.entrust.com/ou=Entrust Managed Services SSP CA,ou=Certification Authorities,o=Entrust,c=US?cACertificate;binary,crossCertificatePair;binary"; 
$LDAP =~ '^\w+\W+(.*)/(.*)\?.*$'; 
$LDAP_host = $1; 
$LDAP_base = $2; 
print "\$LDAP_base => $LDAP_base\n\$LDAP_host => $LDAP_host\n"; 

输出会是这样:

$ LDAP_base => OU =委托管理服务SSP CA,OU =证书颁发机构,O =委托,C = US $ = LDAP_host> sspdir.managed。 entrust.com