2009-06-02 7 views
1

Comment puis-je faire correspondre tout avec une expression régulière PHP? J'ai essayé: /[.\r\n]*/, mais ça ne marche pas. Des idées? Merci.Comment puis-je faire correspondre tout avec une expression régulière PHP?

C'est une méthode que j'ai fait pour une classe PHP pour analyser les e-mails:

public function getHeader($headerName) { 
    preg_match('/[\r\n]' . $headerName . '[:][ ](.+)[\r\n][^ \t]/Uis', "\n" . ltrim($this->originalMessage), $matches); return preg_replace('/[\r\n]*/', '', $matches[1]); 
    } 
+4

Vous avez probablement besoin de clarifier un peu, car si vous voulez vraiment faire correspondre * tout *, il n'y a pas besoin de correspondance du tout. Fais juste ce que tu as besoin de faire avec la source elle-même. –

+2

J'espère que vous ne faites pas juste tout pour contourner les traces. –

Répondre

0

Qu'en est-/.*/s?

Dans une classe de caractères (le []),. signifie simplement période.

+0

Cela ne correspond pas aux nouvelles lignes. –

+0

Oui, il correspond à de nouvelles lignes: perl -e 'print "correspond \ n" si "\ n" = ~ m/\ A. * \ Z/s' –

9

/.*/s (voir perl's docs). L'option s signifie (en citant cette URL):

Traiter la chaîne comme une seule ligne. (Faire. Correspondent à une nouvelle ligne)

6

Je suppose, en fonction de votre inclusion de \n et \r ci-dessus, que vous voulez faire correspondre à travers plusieurs lignes. Dans ce cas, utilisez:

/.*/s

(. Notez le modificateur /s explicite, qui est, changer . pour correspondre à tout caractère que ce soit, même un saut de ligne, qu'il ne serait normalement pas correspondre)

Voir http://www.perl.com/doc/manual/html/pod/perlre.html

+0

Cela a fonctionné pour ce dont j'avais besoin! Merci –

0

Est-ce que /[\.\r\n]+/ fait ce que vous voulez?

Cette bidouille a également travaillé pour moi avant:

my $abstract_text = /Abstract:([\s\S]+?)\nReferences/m; 

Il est utile si vous voulez capturer des motifs avec un texte arbitraire inclus ou intervenir entre plusieurs captures.

2

Pourquoi voulez-vous tout faire? Il ne sert à rien de l'utiliser comme condition parce que c'est toujours vrai. Si vous voulez capturer le texte, vous n'avez pas besoin d'une regex pour le faire parce que vous utilisez simplement la chaîne entière. Si vous essayez de contourner la viciation, alors honte à vous (et poser une question distincte à ce sujet).

Notez que nous avons un peu du XY Problem ici. Vous avez une tâche X en tête et pensez que Y fait partie de la solution. Vous posez des questions sur Y mais ne nous dites jamais X. Il est difficile de répondre à votre vraie question lorsque nous ne savons pas ce que vous essayez de faire. :)

+0

Vous devriez mettre à jour votre question, ne pas le cacher dans un commentaire :) –

+0

Il semble que votre vraie question est "Comment puis-je extraire les en-têtes de messagerie avec PHP?". Il y a sûrement une classe PHP qui le fait déjà. –

Questions connexes