Главная страница


ru.perl

 
 - RU.PERL ----------------------------------------------------------------------
 From : Alexander P. Russkih                 2:468/75       05 Feb 2004  11:51:36
 To : All
 Subject : Re: rfc822 regexp
 -------------------------------------------------------------------------------- 
 
 Vladimir Litovka wrote:
 
 > ну я в итоге сделал примерно так - только не разбираю по-адресно всю 
 > строку, а выделяю из нее три части - _до_ нужного мне фрагмента, собственно 
 > фрагмент и _после_ него. В первом приближении получилось вот так (смотрится 
 > страшно :-) ), может еще как-то можно оптимизироваться, но я пока не вижу:
 > 
 > $remove = "toremove user <toremove\@qqq>";
 > $header = "Subject: test\nCc: empty\@qqq, toremove\@qqq\nTo: toremove user 
 > <toremove\@qqq>";
 > 
 > if ($header =~ s/(^|\n)((?:To):[ \t]+)(.*?)([,\s]*)(?:$remove)([, 
 > \t]*)(.*?)((\n(\w))|$)/$1$9/is) {
 > 
 >    chomp $header;
 > 
 >     if ($4 && $5) {  # Between other field's entries
 >       $header .= "\n".$2.$3.', '.$6;
 >      }
 >     elsif ($4) {    # Last in field
 >       $header .= "\n".$2.$3.$6;
 >      }
 >     elsif ($5) {    # First in field
 >       $header .= "\n".$2.$6;
 >      }
 >     # else - single in field, do nothing
 >   }
 > 
 > К сожалению, парсить сразу и To, и Cc (т.е. написать (To|Cc)) не 
 > получается, т.е. придется запускать этот regexp дважды. Интересно, он очень 
 > сложный и медленный? :-)
 
 не  знаю насколько мое решение элегантней, но вот оно, рожденное только что на 
 коленке:
 === кут хере ===
 #!/usr/bin/perl -w
 use strict;
 use English;
 
 my $mailheader;
 while (<DATA>) {
    $mailheader.= $_;
 }
 
 my $excludeaddr = q!blah1 <blah1@blah>!;
 print "> $excludeaddr <\n";
 
 my $rfc;
 foreach $rfc ('To','Cc','Bcc') {
 
    # собственно "выкусывание" из заголовка строк To, Cc или Bcc, в зависимости
    # от итерации цикла foreach $rfc
    my($addr) = $mailheader =~ m/(?:^|\n)$rfc:\s+([^\n\t]*(\n\t[^\n\t]*)*)/s;
 
    # выполняем последующие телодвижения только в случае успешного совпадения
    if (defined($addr)) {
 
      # удаляем ненужные переводы каретки и табуляции
      $addr =~ s/[\n\t]//gs;
 
      # легким движением руки исключаем адрес заданный в $excludeaddr
      $addr =~ s/$excludeaddr,?//gs;
 
      # удаляем запятую в конце строки (если она есть)
      ($addr) = $addr =~ m/([^,]*(,[^,]*)*?)(\s*,\s*)?$/;
 
      # отпечатываем результат (или чего еще там требуется?)
      print ">> $addr \n";
 
    }
 }
 
 __END__
 From: blah-blah
 To: blah-blah <blah@blah>, blah1 <blah1@blah>,
   blah2 <blah2@blah>,
   dabi-dabi <makabuka@aol>
 Cc: blah3@blah, blah1 <blah1@blah>
 Subject: rfc822 regexp
 To: blah-blah <blah@blah>
 === кут хере ===
 -- 
 XMMS: %s
 
 --- Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.5) Gecko/20031007
  * Origin: Registered Linux User #341226 (2:468/75@fidonet)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Re: rfc822 regexp   Alexander P. Russkih   05 Feb 2004 11:51:36 
 Re: rfc822 regexp   Alexander P. Russkih   05 Feb 2004 11:59:37 
Архивное /ru.perl/1098021c1ffa5.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional