#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
важно, поскольку это позволяет $
сопоставлять разрывы строк.