Используя PHP, как найти более длинную строку для более короткой строки, которая начинается и заканчивается чем-то конкретным? - PullRequest
0 голосов
/ 07 июня 2019

Я работаю над системой тикетов PHP, где я отправляю электронные письма, беру их HTML и вставляю в базу данных.

Я добавил эту строку в мои исходящие письма:

## If you reply, text above this line is added to the request ##

Видел подобные вещи в электронном письме Upwork, и было достаточно просто захватить только адрес электронной почты / HTML ДО этой уникальной строки, используя:

//now, get only the stuff before our "dividing" line starts
$html = strstr($html, '## If', true) ?: $html;

В любом случае, я заметил, что Gmail автоматически добавляет следующееответы по электронной почте:

On Fri, Jun 7, 2019 at 2:40 PM Carson Wentz<carson.wentz@gmail.com> wrote:

Итак, после того, как я выполню первый шаг, оставлю только слова перед "## Если вы отвечаете ...", я теперь хотел бы найти оставшийся текст / html, чтобы увидеть, есть ли в немстрока, начинающаяся с «On» и заканчивающаяся «wrote:».И если это так, только захватите материал до этого (аналогично шагу 1).

У меня возникают проблемы с поиском чего-то, что четко объясняет, как искать более длинную строку для более короткой строки, которая НАЧИНАЕТСЯ с чего-то и ЗАВЕРШАЕТСЯ чем-токонкретный, независимо от того, что в середине.Я полагаю, что нужно было бы использовать REGEX?

Однако, когда я писал это, я просто понял, что вполне вероятно, что в какой-то момент кто-то может начать свой ответ с «Вкл», и в этом случае ВСЕ будет удалено.Тьфу.

Если у кого-то есть идеи, если это можно решить, пожалуйста, дайте мне знать.Больше я думаю об этом, возможно, мне просто нужно, чтобы строка, включенная в Gmail, появлялась во всех ответах в системе заявок, поскольку я не думаю, что есть абсолютный способ получить эту точную строку, поскольку она включает дату / время и имяинформация, которая, очевидно, всегда отличается.

Спасибо за ваше время.

1 Ответ

1 голос
/ 07 июня 2019

Вы можете использовать preg_replace и следующий шаблон:

/^(?:On .+?> wrote:)?((\R|.)+?)## If you reply, text above this line is added to the request ##/

Это необязательно соответствует литералу On, затем любые символы до > wrote:\n от начала строки тела, затем захватываетвсе до сообщения о завершении, включая новые строки с \R.

Конечно, вы можете пойти дальше, чтобы сделать шаблон заголовка более строгим, но кажется маловероятным, что кто-то напишет On [any characters...]> wrote:\n в точно в первой строке, что является ложным срабатываниеми может привести к потере информации.Переход по строгому маршруту может привести к крайним случаям, когда необычный адрес электронной почты приводит к ложному отрицанию и неправильно считается частью тела.

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

Используйте ^\s*On, если перед началом On... могут быть пробелы.

<?php

$withGmailHeader = "On Fri, Jun 7, 2019 at 2:40 PM Carson Wentz<carson.wentz@gmail.com> wrote:

Here's the text content of the email. We'd like to extract it.

On Fri, Jun 6, 2019 at 2:53 AM Bob Smith<bob@gmail.com> wrote:
'hello'

## If you reply, text above this line is added to the request ##";
$withoutGmailHeader = "On Fri, Jun 7, 2019 at 2:40 PM Carson Wentz<carson.wentz@gmail.com>  wrote:

Here's the text content of the email. We'd like to extract it.

On Fri, Jun 6, 2019 at 2:53 AM Bob Smith<bob@gmail.com> wrote:
'hello'

## If you reply, text above this line is added to the request ##";

$pattern = "/^(?:On .+?> wrote:)?((\R|.)+?)## If you reply, text above this line is added to the request ##/";

preg_match($pattern, $withGmailHeader, $match);
echo "\n=> With Gmail header:\n";
var_export($match[1]);
echo "\n\n=> Without Gmail header: (note the extra space after >)\n";
preg_match($pattern, $withoutGmailHeader, $match);
var_export($match[1]);

Вывод:

=> With Gmail header:
'

Here\'s the text content of the email. We\'d like to extract it.

On Fri, Jun 6, 2019 at 2:53 AM Bob Smith<bob@gmail.com> wrote:
\'hello\'

'

=> Without Gmail header (note the extra space after >):
'On Fri, Jun 7, 2019 at 2:40 PM Carson Wentz<carson.wentz@gmail.com>  wrote:

Here\'s the text content of the email. We\'d like to extract it.

On Fri, Jun 6, 2019 at 2:53 AM Bob Smith<bob@gmail.com> wrote:
\'hello\'

'
...