3

我正在尝试制作一个正则表达式来验证 iSCSI 限定名称。一个限定名称的例子是iqn.2011-08.com.example:storageThis is example is minimum,我见过其他更扩展的例子。

到目前为止,我必须对此进行验证:

print "Enter a new target name: ";

my $target_name = <STDIN>;

chomp $target_name;

if ($target_name =~ /^iqn\.\d{4}-\d{2}/xmi) {

    print GREEN . "Target name is valid!" . RESET . "\n";

} else {

    print RED . "Target name is not valid!" . RESET . "\n";

}

我如何将它扩展到与休息一起工作,因为它是一个描述标签,:所以我不会在之后解析。:

域名的大小是否有限制?

4

2 回答 2

5

根据 RFC3270(以及 RFC1035),

/
   (?(DEFINE)
      (?<IQN_PAT>
         iqn
         \. 
         [0-9]{4}-[0-9]{2}
         \.
         (?&REV_SUBDOMAIN_PAT)
         (?: : .* )?
      )

      (?<EUI_PAT>
         eui
         \.
         [0-9A-Fa-f]{16}
      )

      (?<REV_SUBDOMAIN_PAT>
         (?&LABEL_PAT) (?: \. (?&LABEL_PAT) )*
      )

      (?<LABEL_PAT>
         [A-Za-z] (?: [A-Za-z0-9\-]* [A-Za-z0-9] )?
      )
   )

   ^ (?: (?&IQN_PAT) | (?&EUI_PAT) ) \z
/sx

目前尚不清楚 eui 名称是否接受小写十六进制数字。我认为允许他们更安全。

如果你把上面的内容浓缩,你会得到/^(?:iqn\.[0-9]{4}-[0-9]{2}(?:\.[A-Za-z](?:[A-Za-z0-9\-]*[A-Za-z0-9])?)+(?::.*)?|eui\.[0-9A-Fa-f]{16})\z/s.

(顺便说一句,你的使用/m是错误的,你的使用/i是错误的,并且\d可以匹配远远超过允许的[0-9]。)

于 2011-09-09T01:46:19.617 回答
0

如果您只需要之前的部分,:则可以使用以下正则表达式:

if ($target_name =~ /^iqn\.(\d{4}-\d{2})\.([^:]+):/xmi) {
    my ($date, $reversed_domain_name) = ($1, $2);

正则表达式[^:]+匹配 1 个或多个非:符号。即使域名格式不正确,它也会匹配。进一步的改进取决于您的目标:您只需要获取 iSCSI 名称的各个组成部分还是需要验证其语法?


域名的大小是否有限制?

来自维基百科

完整域名总长度不得超过253

于 2011-09-09T01:20:40.873 回答