Синтаксический анализ строки электронной почты с использованием регулярного выражения

#php #regex

#php #регулярное выражение

Вопрос:

Я пытаюсь выполнить сложное (для меня) регулярное выражение для многострочного фрагмента из электронного письма. Я изо всех сил старался, но безуспешно. Я пытаюсь избавиться от чего-либо, начиная с «Вкл» и заканчивая «написал:»

Было бы неплохо, если бы вы также могли проверить, содержит ли оно слово «AcmeCompany», чтобы оно не проверяло все, что «На » «написано:»

Пока у меня есть это: /On(.*)AcmeCompany(.*)/im но это не работает…

 say hello, world!

On Tue, Jun 7, 2011 at 6:18 AM, AcmeCompany <
24a95f49f7ce573fds2d c@AcmeCompany.com> wrote:
  

Спасибо за ответы, но, похоже, есть другая проблема.

РЕДАКТИРОВАТЬ: Я обнаружил, что это работает: /On[sS] ?AcmeCompany[sS] ?wrote:/m , но, похоже, это не работает, когда в содержимом электронной почты есть слово «Включено».

 say hello, world!

On a plane!    

On Tue, Jun 7, 2011 at 6:18 AM, AcmeCompany <
24a95f49f7ce573fds2d c@AcmeCompany.com> wrote:
  

ПРАВКА2: каждый почтовый клиент индивидуален… gmail обычно делает это в 2 строки, почтовое приложение с iphone делает это в 1 строку, поэтому оно не всегда придерживается строгого формата.

Одно можно сказать наверняка: в начале всегда используется «On», а заканчивается » writed:». Он также содержит хэш и AcmeCompany, которые я также могу использовать для проверки.

Комментарии:

1. Вам не нужно записывать .* , попробуйте On.*AcmeCompany.*

2. . не будет перехватывать новую строку, вот почему у вас возникают проблемы с регулярным выражением, которое занимает более одной строки.

3. @Michael Pryor: Я пытался использовать sm вместо im, я был довольно близок к этому, но когда у меня есть On blah blah On Tues Jun 7, , это ломается..

4. Привет, пожалуйста, попробуйте один раз использовать /On[s S] ? AcmeCompany[s S] ?написал:/

5. @sudimail Я пересмотрел вопрос, ваше решение работает, но оно столкнулось с другой проблемой…

Ответ №1:

Для нового требования я добавляю еще один ответ. Надеюсь, вы не будете возражать.

Можете ли вы попробовать что-то подобное?

 /Ons(Mon|Tue|Wed|Thu|Fri|Sat)[sS] ?AcmeCompany[sS] ?wrote:/
  

Я пытаюсь снова .. как насчет использования?

 /On. ?AcmeCompany[sS] ?wrote:/
  

Комментарии:

1. Я изменяю здесь, как, но опять же, если содержимое имеет название дня! пытаюсь подумать!

2. оказывается, не каждый почтовый клиент включает пн / вт / ср… но каждый почтовый клиент включает «Включено» и «написал:», так что это будет работать только для gmail и hotmail. 🙁

Ответ №2:

Надеюсь, это поможет:

 /On[sS] ?AcmeCompany[sS] ?wrote:/
  

Приведенное выше регулярное выражение сначала сопоставляет On , а затем любое из all spaces и non-spaces (вместе проглатывая все символы и новые строки) в режиме отложенного повторения, пока не найдет AcmeCompany . Снова он сопоставляет all spaces и non-spaces (вместе проглатывая все символы и новые строки) с ленивым повторением, пока не найдет wrote:

Комментарии:

1. Привет, это действительно работает, но кажется, что он собирает что-либо «На» и после…

Ответ №3:

Это сработает:

 On.*AcmeCompany.*
  

Может быть, оффтоп, но…
Если вы хотите изучить регулярные выражения, вам следует попробовать Expresso

Пример работы Expresso:

введите описание изображения здесь

Ответ №4:

Чтобы получить строку перед On Tue,Jun …:

 $str = explode ('On', $yourstring);
$oldstr = array_pop($str); //Remove the last value of the $str array
echo trim( implode('On',$str) ); //Trim the string to remove any unnecessary line breaks
  

Чтобы определить, содержит ли скрытое сообщение AcmeCompany :

 if( strstr ( $oldstr , 'AcmeCompany' ) ) {
    echo "I found AcmeCompany!";
} else {
    echo "I didn't find AcmeCompany!";
}
  

Надеюсь, мой ответ полезен, хотя я и не использовал регулярное выражение.

Комментарии:

1. Привет, интересная концепция.. Если у нас где-нибудь в теле есть «Включено», то это решение не сработает … в крайнем случае, я мог бы обрезать 2 строки

2. Да, но это показывает, что ваш скрипт сломался бы, если бы чей-то комментарий был: say hello, world! On Tue, Jun 7, 2011 at 6:18 AM, Hacker <hacker@hacker> wrote:

3. Это тоже верно … возможно, лучше обрезать последние 2 строки.. Однако это маловероятно =/

4. Я должен отдать вам должное ( 1), но это все еще не соответствует требованиям. Если у отправителя есть куча «Включено», то это не сработает.

5. Что ж, во время моих тестов это сработало, потому что array_pop функция удаляет последнее значение (комментарий, который вы хотите удалить) и сохраняет остальные.

Ответ №5:

Попробуйте это: /On.*AcmeCompany <$[^:] :/im , m важно, поскольку это позволяет $ сопоставлять разрывы строк.