优化正则表达式以捕获电子邮件签名

时间:2013-07-05 12:37:15

标签: php regex preg-replace

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

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

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);

它有效,但经过一些快速测试后,我意识到这个正则表达式真的慢。

我在正则表达方面不是那么好,有人可以看一下正则表达式&amp;告诉我如何优化它&amp;快点?

2 个答案:

答案 0 :(得分:3)

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

如果您认为您的用户将在邮件中间使用与正则表达式匹配的行,您可能还想从底部而不是从顶部开始。

答案 1 :(得分:0)

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

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