Как я могу проверить имя файла только с восемью цифрами и расширением, в Perl? - PullRequest
1 голос
/ 03 октября 2009

Perl (модули не загружены и -Tw & строгие) Я нашел много информации о регулярных выражениях и сопоставлении с образцом здесь, но не совсем то, что мне нужно. Я хочу знать, если это правильный способ проверить пару вещей. Извините за попытку новичка здесь. Я совершенно новичок в этом.

my $this = "12345678";

if ($this != m/\b[0-9]{8}\b/x) { print "$this is bad"; }

my $that = "12345678.gif";

if ($that != m/\b[0-9]{8}\.gif\b/x) { print "$that is bad"; }

or

if ($that != m/\b[0-9]{8}\.(jpe?g|gif|png)\b/x) { print "$that is bad"; }


my ($ext) = $that =~ m/\.([^\.]+)$/x;

# verify extension
if  ($ext != m/\.(jpe?g|png|gif)$/x ){ print "$ext is bad"; }

# for content type
if ($ext eq "jpg") {$ext = "jpeg";} 

Я использую / x, потому что perl :: crit указал, что мне это нужно. Проходит с / х, так что ...

\ d не вариант, и его следует избегать из того, что я прочитал здесь.

Имя файла «тот» должно быть 8 цифр + тип изображения. Другой набор цифр «this» на самом деле является именем папки. Это обеспечивает небольшую проверку ошибок для сценария обслуживания изображений. Корневой htaccess отправляет вызовы изображений в определенной папке в указанный скрипт. Я беру каталог и имя изображения с помощью информации о пути.

Я ценю все советы прошлого и настоящего здесь ... Я многому научился.

Ответы [ 3 ]

3 голосов
/ 03 октября 2009

Если вы работаете с проверкой заражения, это не способ сделать это. Вы должны соответствовать шаблону, который вам нужен, затем запомните это в переменной памяти, чтобы очистить эту грязь:

my $this = ...;

my $regex = qr/
          ^             # beginning of string
          (             # start of $1
            [0-9]{8}
            \.
            (gif|jpg)   # extension in $2
          )
          \z            #end of string
          /x;

my( $cleansed, $extension ) = do { 
    if( $this =~ m/$regex/ ) { ( $1, $2 ) }
    else                  { die "Bad filename!" }
    };

Я не уверен, почему у вас есть \b в начале вашего регулярного выражения. Это, вероятно, не делает то, что вы думаете, что делает. Если вы хотите, чтобы имя файла состояло только из цифр, вместо него использовалось начало строки ^. Таким образом, ничто не может прийти до цифр. Точно так же конец якоря строки \z говорит о том, что после расширения ничего не может прийти.

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

 my %types = (
      jpg => jpeg,
      gif => gif,
      ...
      );

Теперь, когда у вас есть хеш, вы можете использовать его как еще один уровень проверки:

 unless( exists $types{$extension} ) { die "Unsupported type!" }
2 голосов
/ 03 октября 2009

Большая часть того, что у вас есть, выглядит хорошо. Несколько баллов:

  • if ($ext != m/pattern/) неверно - оператор != должен быть !~
  • \ d - это нормально, если вы анализируете имена файлов или что-то еще, что вряд ли будет в юникоде
  • избегайте / x, если вам это действительно не нужно (вы не разделяете регулярное выражение на несколько строк для удобства чтения). В связи с этим, избегайте любых флагов, если они вам не нужны
  • (jpe?g|gif|png) можно изменить на (?:jpe?g|gif|png), чтобы отключить захват этого набора скобок (в большинстве случаев повышение эффективности является номинальным, но иногда оно может иметь значение, например, в быстром цикле, поэтому я делаю это привычкой не захватывать, если мне не нужно)
  • вам не нужно убегать . внутри класса персонажа - то есть [^\.] может быть [^.] (я считаю, что единственный символ, который вам нужно убежать, это сам], но не принимайте это как евангелие) :)
  • это "Perl", а не "PERL":)
0 голосов
/ 03 октября 2009

Вам нужно использовать =~ и !~ вместо == и != для сопоставления регулярному выражению. Кроме того, после удаления избыточного кода и оптимизации, я бы написал так.

my $that = "12345678.gif";    
if ($that =~ m/\b[0-9]{8}\.(jpe?g|gif|png)\b/x)
{
    my $ext = $1; 
    if ($ext eq "jpg") {$ext = "jpeg";}
}
else
{
    print "$that is bad";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...