2009-12-14 4 views
6

J'utilise le site suivant pour tester un regex PHP, donc je n'ai pas à télécharger en permanence: http://www.spaweditor.com/scripts/regex/index.phpPHP preg_replace des problèmes non gourmands

J'utilise l'expression rationnelle suivante:

/(.*?)\.{3}/ 

sur la chaîne suivante (en remplaçant rien):

Non-important data...important data...more important data 

et preg_replace est de retour:

more important data 

pourtant j'attendre qu'il revienne:

important data...more important data 

Je pensais que le? est le modificateur non-gourmand. Que se passe t-il ici?

+0

Quels paramètres utilisez-vous sur le site que vous avez lié? Je l'ai juste essayé et j'ai récupéré des "données non importantes" comme je m'y attendais. Votre expression régulière trouve le premier match, et en saisissant le moins possible avant de trouver un '...'. –

+0

@Doug Neiner: Sur son lien de site Web, assurez-vous de sélectionner 'preg_replace' dans la dernière section. J'ai été capable de reproduire les résultats de l'OP de cette façon. – Asaph

+1

Ah, très vrai. Choisi le mauvais. –

Répondre

8

Votre modificateur non glouton fonctionne comme prévu. Mais preg_match remplace tous les occurrences de la correspondance (non gourmande) avec le texte de remplacement ("" dans votre cas). Si vous souhaitez uniquement remplacer le premier, vous pouvez passer le 1 en tant que quatrième argument facultatif (limite) à la fonction preg_replace (PHP docs for preg_replace). Sur le site Web que vous avez lié, cela peut être accompli en tapant 1 dans la saisie de texte entre le mot «Flags» et le mot «limite».

+1

+1 @Asaph, bonne réponse. J'avais choisi 'preg_match' au lieu de' preg_replace' quand j'ai essayé le lien, donc c'est par moi de l'odeur. Vous êtes bien sûr complètement correct dans votre réponse! –

0

juste un exemple réel de solution @Asaph. Dans cet exemple, vous n'avez pas besoin de non-gourmandise car vous pouvez spécifier un nombre. remplacez simplement la première occurrence de @ dans une ligne avec un marqueur

$line=preg_replace('/@/','zzzzxxxzzz',$line,1);