如何使用正则表达式验证iSCSI目标名称?

时间:2011-09-08 23:31:01

标签: regex perl iscsi

我正在尝试制作一个regexp来验证iSCSI限定名称。限定名称的示例是iqn.2011-08.com.example:storage这是最小的示例,我已经看到了更多扩展的其他示例。

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

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";

}

我怎样才能将其扩展到:休息,:之后我不会解析它是一个描述标记。

域名的大小是否有限制?

2 个答案:

答案 0 :(得分: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]。)< / p>

答案 1 :(得分:0)

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

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

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


  

域名的大小是否有限制?

来自Wikipedia

  

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