RegEx для разбора «Диагностического кода» в отклоненном письме - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь читать отклоненные электронные письма, подключаясь через PHP к учетной записи IMAP и получая все электронные письма.Я пытаюсь получить сообщение «Диагностический код» для каждого электронного письма, и я написал следующее регулярное выражение:

/Diagnostic-Code:\s+?(.*)/i

Сообщение, которое я пытаюсь проанализировать, выглядит так:

Diagnostic-Code: smtp; 550-5.1.1 The email account that you tried to reach does
    not exist. Please try 550-5.1.1 double-checking the recipient's email
    address for typos or 550-5.1.1 unnecessary spaces. Learn more at 550 5.1.1
    https://support.google.com/mail/?p=NoSuchUser 63si4621095ybi.465 - gsmtp

Регулярное выражение работает частично, означая, что оно выбирает только первую строку текста.Я хочу иметь возможность получить все сообщение, поэтому все четыре строки текста.

Можно ли обновить выражение, чтобы сделать это соответствие?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 28 января 2019
/Diagnostic-Code:\s(.*\n(?:(?!--).*\n)*)/i
  • результат будет в группе захвата 1
  • first .*\n соответствует первой строке, включая завершающий перевод новой строки
  • (?:(?!--).*\n)* соответствует последующим строкам, которые не начинаются "- "
0 голосов
/ 28 января 2019

Если может быть несколько сообщений, начинающихся с Diagnostic-Code:, вы можете использовать:

^Diagnostic-Code:\K.*(?:\R(?!Diagnostic-Code:).*)*

См. Демонстрационную версию regex | Php demo

Пояснение

  • ^ Начало строки
  • Diagnostic-Code: Совпадение буквально
  • \K.* Забудьте, что было найдено, и следуйте за остальной частью строки
  • (?: Не каптуриновая группа
    • \R(?!Diagnostic-Code:).* Соответствует последовательности новой строки Юникода, за которой следует отрицательный просмотр, чтобы проверитьто, что следует, не !Diagnostic-Code:.Если это так, то сопоставьте всю строку
  • )* Закройте группу без захвата и повторите 0+ раз
0 голосов
/ 28 января 2019

Добавьте флаг s:

/Diagnostic-Code:\s+?(.*)/si

С этот вопрос :

В PHP ... [t] он находится наконец заставляет точку совпадать со всеми символами, включая символы новой строки.

Это позволит вашему регулярному выражению соответствовать целому (см. это регулярное выражение101 ).Просто не забудьте добавить какой-нибудь способ закончить его, если после этого у вас будет больше текста.

...