2 votes

Optimiser regexp pour attraper les signatures e-mail

J'ai un script PHP qui reflète ma liste de diffusion vers un forum en ligne, afin de rendre l'importation du forum aussi agréable que possible, j'utilise des expressions régulières pour capturer les signatures électroniques et les styliser de manière appropriée. Les formats de signature que je capture avec la regex sont:

Ceci est mon message...
--
Ma signature
TheDude.

Et

Ceci est mon message...
---------------
Ma signature
TheDude.

En ce moment, j'utilise cette regex:

$message = preg_replace('/\s*(.+)(\s*[\r\n]-{2,}\s+.*)/s', '$1$2', $message);

Cela fonctionne, mais après quelques tests rapides, j'ai réalisé que cette regex est vraiment lente.

Je ne suis pas si doué en regex, est-ce que quelqu'un pourrait jeter un coup d'œil à la regex et me dire comment l'optimiser pour la rendre plus rapide?

3voto

Daniel Landau Points 1712

Vous utilisez des expressions régulières pour traiter l'ensemble du message, ce qui risque d'être lent. Une meilleure alternative serait d'utiliser une logique de programmation appropriée pour traiter le message. Par exemple, parcourir le message ligne par ligne et tester si chaque ligne correspond à votre regex "début de signature". Si ce n'est pas le cas, ajoutez-le au tableau ou à la chaîne contenant le message réel. Si cela correspond, ajoutez le reste du message au pied de page.

Vous pouvez également envisager de commencer par le bas plutôt que par le haut, si vous pensez que vos utilisateurs utiliseront des lignes correspondant à votre regex au milieu du message.

0voto

Stephan Points 10596

En supposant qu'une signature commence avec au moins deux - au début de la ligne et se termine par \r\n, \r ou \n une ou plusieurs fois, essayez ceci :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X