|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Vladimir Litovka 2:5020/400 05 Feb 2004 01:24:23 To : Alexey Mahotkin Subject : Re: rfc822 regexp -------------------------------------------------------------------------------- Alexey Mahotkin wrote: > Парсинг RFC822 с помощью регексов -- чья-то старая не очень добрая шутка, > которая ходит с тех пор по неокрепшим умам. да собственно мне ведь не парсинг нужен в полном объеме, а всего лишь выкусывание подстроки из хитрой строки :) > Удали из этого списка те адреса, которые тебе не нравятся, и собери их > обратно в соответствующие поля. Hа RFC822-комментарии забей. ну я в итоге сделал примерно так - только не разбираю по-адресно всю строку, а выделяю из нее три части - _до_ нужного мне фрагмента, собственно фрагмент и _после_ него. В первом приближении получилось вот так (смотрится страшно :-) ), может еще как-то можно оптимизироваться, но я пока не вижу: $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 дважды. Интересно, он очень сложный и медленный? :-) > Я не знаю, зачем бы мог понадобиться другой алгоритм. красивее сделать одним выражением, правда? :-) -- Man is incomplete until he is married. Then he is finished. --- ifmail v.2.15dev5.3 * Origin: Svit Online (post does not reflect views of Golden Tele (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/167950ef162a8.html, оценка из 5, голосов 10
|