使用PHP,如何在较长的字符串中搜索以特定内容开头和结尾的较短的字符串?

时间:2019-06-07 19:06:56

标签: php substr

我正在使用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:

因此,在执行第一步后,仅将内容保留在“ ##如果您回复...”之前,我现在要搜索其余的text / html以查看其是否具有以“ On”开头并以结尾开头的字符串与“写:”。如果是这样,请只抓住之前的东西(类似于步骤1)。

我很难找到任何明确的解释来解释如何搜索一个较长的字符串以查找一个较短的字符串,该字符串以某些内容开头,以某些特定内容结束,而不论中间是什么。我想它必须使用REGEX?

但是,当我写这篇文章时,我只是意识到,很可能有人会在某些时候以“开”开始回复,在这种情况下,所有内容都将被删除。 gh。

如果有人有任何想法可以解决,请告诉我。我想得更多,我可能只需要让包含Gmail的行出现在票务系统中的所有回复中,因为我认为没有绝对的方法可以获取确切的字符串,因为它包含日期/时间和名称信息显然总是不同的。

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

您可以使用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\'

'