Как использовать регулярные выражения для проверки имен целей iSCSI? - PullRequest
3 голосов
/ 09 сентября 2011

Я пытаюсь создать регулярное выражение для проверки правильных имен 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 ]

5 голосов
/ 09 сентября 2011

Согласно 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].)

0 голосов
/ 09 сентября 2011

Если вам нужна только часть до :, вы можете использовать следующее регулярное выражение:

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

Regexp [^:]+ соответствует 1 или более не : символам. Это будет соответствовать, даже если доменное имя не правильно сформировано. Дальнейшие улучшения зависят от вашей цели: вам нужно просто получить отдельные компоненты имени iSCSI или вам нужно проверить его синтаксис?


Существует ли ограничение на размер доменного имени?

Из Википедия :

Полное доменное имя не должно превышать общую длину 253

...