как перейти от preg_match к preg_replace?

1

см. следующий код:

происходит от: http://www.damnsemicolon.com/php/php-parse-email-body-email-piping

//get rid of any quoted text in the email body
$body_array = explode("\n",$body);
$message = "";
foreach($body_array as $key => $value){

    //remove hotmail sig
    if($value == "_________________________________________________________________"){
        break;

    //original message quote
    } elseif(preg_match("/^-*(.*)Original Message(.*)-*/i",$value,$matches)){
        break;

    //check for date wrote string
    } elseif(preg_match("/^On(.*)wrote:(.*)/i",$value,$matches)) {
        break;

    //check for From Name email section
    } elseif(preg_match("/^On(.*)$fromName(.*)/i",$value,$matches)) {
        break;

    //check for To Name email section
    } elseif(preg_match("/^On(.*)$toName(.*)/i",$value,$matches)) {
        break;

    //check for To Email email section
    } elseif(preg_match("/^(.*)$toEmail(.*)wrote:(.*)/i",$value,$matches)) {
        break;

    //check for From Email email section
    } elseif(preg_match("/^(.*)$fromEmail(.*)wrote:(.*)/i",$value,$matches)) {
        break;

    //check for quoted ">" section
    } elseif(preg_match("/^>(.*)/i",$value,$matches)){
        break;

    //check for date wrote string with dashes
    } elseif(preg_match("/^---(.*)On(.*)wrote:(.*)/i",$value,$matches)){
        break;

    //add line to body
    } else {
        $message .= "$value\n";
    }

}

//compare before and after
echo "$body<br><br><br>$message";

$ body содержит полный элемент электронной почты, включая цитированную область, если это ответ, этот цикл удаляет цитированную область, чтобы получить новый ответ как $ message. Но, как было предложено, цикл медленный и лучше использовать preg_replace. так как я могу это сделать?

заменить шаблоны тем, что? Должен ли я удалить петлю foreach? Я создал ниже без циклы foreach, но кажется неправильным? пожалуйста посоветуй.

$patterns = array(
"_________________________________________________________________",
"/^-*(.*)Original Message(.*)-*/i",
"/^On(.*)wrote:(.*)/i",
"/^On(.*)$fromName(.*)/i",
"/^On(.*)$toName(.*)/i",
"/^(.*)$toEmail(.*)wrote:(.*)/i",
"/^(.*)$fromEmail(.*)wrote:(.*)/i",
"/^>(.*)/i",
"/^---(.*)On(.*)wrote:(.*)/i");

$message = preg_replace($patterns, '', $body);
  • 1
    Вам, по крайней мере, понадобится многострочный модификатор /m , чтобы они работали вне линейного foreach. В противном случае объясните с конкретными примерами и сообщениями об ошибках, как это не работает.
  • 0
    не могли бы вы просто переписать блок кода на этой ссылке с помощью preg_replace вместо preg_match, чтобы я мог лучше понять его?
Показать ещё 3 комментария
Теги:
preg-match
pcre
preg-replace

1 ответ

1
Лучший ответ

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

  1. Как прокомментировал @mario, вам нужно установить модификатор /m для символа ^ для соответствия в начале каждой строки.
  2. Ваш первый шаблон должен быть заключен с разделителями и привязан к ^ и к концу строки, чтобы иметь то же значение, что и в исходном коде.
  3. Включите символы новой строки, чтобы удалить всю строку.
  4. Убедитесь, что переменные $fromName, $fromEmail и т.д. Установлены.
  5. Как только вы получите совпадение, сопоставьте все оттуда до конца тела с помощью (?s:.*).

Код:

$patterns = array(
    "/^_{30,}$(?s:.*)/m",
    "/^.*Original Message(?s:.*)/im",
    "/^(?:---.*)?On .* wrote:(?s:.*)/im",
    "/^On .* $fromName(?s:.*)/im",
    "/^On .* $toName(?s:.*)/im",
    "/^.*$toEmail(.*)wrote:(?s:.*)/im",
    "/^.*$fromEmail.* wrote:(?s:.*)/im",
    "/^>.*/ims",
);
$message = preg_replace($patterns, '', $body);
echo "$body<br><br><br>$message";

Запустите этот код здесь


Слово совета:

Учтите, что он также разделит строки, такие как:

only thing I wrote: ...
  • 0
    Спасибо, так что я должен сделать, чтобы предотвратить проблему, которую вы упомянули? Как сделать так, чтобы он удалял только указанную область электронной почты?
  • 0
    И не обязательно, что fromName и fromEmail будут присутствовать в теле ответа электронной почты, так как предотвратить проблему, упомянутую в # 4?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню