Php 优化regexp以捕获电子邮件签名

Php 优化regexp以捕获电子邮件签名,php,regex,preg-replace,Php,Regex,Preg Replace,我有一个PHP脚本,可以将我的邮件列表镜像到基于web的论坛,为了使论坛导入看起来尽可能好,我使用正则表达式捕获电子邮件签名并适当设置它们的样式。我用正则表达式捕获的签名格式是: This is my message... -- My signature TheDude. 及 现在我正在使用这个正则表达式: $message = preg_replace('/\s*(.+)(\s*[\r\n]-{2,}\s+.*)/s', '$1<span class="msg_footer">$

我有一个PHP脚本,可以将我的邮件列表镜像到基于web的论坛,为了使论坛导入看起来尽可能好,我使用正则表达式捕获电子邮件签名并适当设置它们的样式。我用正则表达式捕获的签名格式是:

This is my message...
--
My signature
TheDude.

现在我正在使用这个正则表达式:

$message = preg_replace('/\s*(.+)(\s*[\r\n]-{2,}\s+.*)/s', '$1<span class="msg_footer">$2</span>', $message);
$message=preg_replace('/\s*(.+)(\s*[\r\n]-{2,}\s+.*)/s','$1$2',$message);
它是有效的,但是经过一些快速测试,我意识到这个正则表达式真的很慢


我不太擅长正则表达式,有人能看看正则表达式并告诉我如何优化它并使其快速吗?

假设一个签名在行首至少以两个
-
开头,以
\r\n
\r
\n
结束一次或多次,请尝试以下操作:

$message = preg_replace(
               '/^(-{2,})(?=(?:\r?\n|\r)+)/m',
               '<span class="msg_footer">$1</span>',
               $message
           );
$message=preg\u replace(
“/^(-{2,})(?=(?:\r?\n |\r)+)/m',
'$1',
$message
);

您正在使用正则表达式处理整个消息,这肯定会很慢。更好的选择是使用适当的编程逻辑来处理消息。例如,逐行检查消息,并测试每一行是否与您的“签名开始”正则表达式匹配。如果不是,则将其添加到包含实际消息的数组或字符串中。如果匹配,则将消息的其余部分添加到页脚


你可能还想从底层开始,而不是从顶部开始,如果你认为你的用户会在消息的中间使用与你的正则表达式匹配的行。

是你的SIGNICS、DASH和两条线到文件末尾的标准吗?我已经想出了一个正则表达式,但是因为你的问题是速度,丹尼尔的建议可能是个好主意。
$message = preg_replace(
               '/^(-{2,})(?=(?:\r?\n|\r)+)/m',
               '<span class="msg_footer">$1</span>',
               $message
           );