doutong4088
2013-07-05 12:37
浏览 50
已采纳

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

I have a PHP script that mirror my mailing list to web-based forum, in order to make the forum import look as nice as possible, I use regular expression to catch email signatures & style them appropriately. The signature formats that I'm catching with the regex are:

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

And

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

Right now I'm using this regex:

$message = preg_replace('/\s*(.+)(\s*[
]-{2,}\s+.*)/s', '$1<span class="msg_footer">$2</span>', $message);

It works, my but after some quick tests, I realized that this regex is really slow.

I'm not that good in regex, can someone please take a look at the regex & tell me how to optimize it & make it fast?

图片转代码服务由CSDN问答提供 功能建议

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

 这是我的消息... 
  -  
我的签名
TheDude。
    
 
 

 这是我的信息...... 
 ---------------  
我的签名
TheDude。
   
 
 

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

  $ message = preg_replace  ('/\*(。+)(\ s * [
 
  -   -   -  {2,} \} +。*)/ s','$ 1&lt; span class =“msg_footer”&gt; $ 2&lt; /  span&gt;',$ message); 
   
 
 

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • duanganleng0577 2013-07-05 12:47
    已采纳

    You are using regular expressions to handle the whole message, which is bound to be slow. A better alternative would be to use proper programming logic to process the message. For instance, go through the message line by line and test for each line whether it matches your "start of signature" regex. If not, add it to the array or string holding the actual message. If it does match, add the rest of the message to the footer.

    You might also want to start from the bottom instead of the top, if you think that your users will use lines matching your regex in the middle of the message.

    点赞 打赏 评论
  • douhe8981 2013-07-05 12:45

    Assuming that a signature starts with at least two - at the beginning of line and ends with either , or one or more times, try this:

    $message = preg_replace(
                   '/^(-{2,})(?=(?:?
    |)+)/m',
                   '<span class="msg_footer">$1</span>',
                   $message
               );
    
    点赞 打赏 评论

相关推荐 更多相似问题