Лучший способ отрубить подпись от тела письма - PullRequest
3 голосов
/ 07 апреля 2009

Я разобрал несколько писем. Mobile Mail, iPhone и я предполагаем, что iPod touch добавляет подпись в качестве отдельной границы, что упрощает ее удаление. Не все почтовые клиенты делают, а просто используют «-» в качестве разделителя подписи.

Мне нужно отрубить '-' из строки, но только последнее ее появление.

Образец копии

 hello, this is some email copy-- check this out
 --
 Tom Foolery

Я думал о разделении на '-', удалении последней части, и я бы получил его, но explode () и split (), похоже, тоже не возвращают большие значения, чтобы сообщить мне, если это что-то произошло, в случае нет совпадения.

Я не могу заставить preg_replace перейти более чем на одну строку. Я стандартизировал все окончания строк \ n

Какое лучшее предложение закончить словами «привет, это какая-то электронная копия - проверьте это», не принимая во внимание, будут случаи, когда нет подписи, и, конечно, будут случаи, когда Я не могу охватить все дела.

Ответы [ 5 ]

8 голосов
/ 07 апреля 2009

На самом деле правильный разделитель подписи равен "-- \n" (обратите внимание на пробел перед новой строкой), таким образом, регулярное выражение должно быть '^-- $'. Хотя вы можете рассмотреть возможность использования '^--\s*$', поэтому он будет работать с OE, что неправильно.

3 голосов
/ 08 апреля 2009

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

        echo substr($body, 0, strrpos($body, "\n--"));
3 голосов
/ 07 апреля 2009

Вместо того, чтобы просто перебирать все после - не могли бы вы кэшировать последние несколько писем, отправленных этим пользователем или службой, и сравнить. Бит внизу, похожий на остальные, можно безопасно удалить, оставив правильное сообщение без изменений.

3 голосов
/ 07 апреля 2009

Попробуйте это:

preg_replace('/--[\r\n]+.*/s', '', $body)

Это удалит все после первого появления -- с последующим одним или несколькими символами разрыва строки. Если вы просто хотите удалить последний случай, используйте /.*--[\r\n]+.*/s.

2 голосов
/ 12 ноября 2012

Это, кажется, дает мне лучший результат:

$body = preg_replace('/\s*(.+)\s*[\r\n]--\s+.*/s', '$1', $body);

  • Это будет соответствовать и обрезать последний "(новая строка) - (необязательный пробел / новые строки) (подпись)"
  • Обрезать все оставшиеся символы новой строки до подписи
  • Обрезать начальные / конечные пробелы в теле (оставшиеся символы новой строки перед подписью, пробелы в начале тела и т. Д.)
  • Будет работать только в том случае, если перед подписью имеется какой-либо текст (без пробелов) (иначе он не удалит подпись и не вернет ее в целости)
...