blocage sur preg_replace je m'en sort pas

Eléphant du PHP | 101 Messages

08 janv. 2006, 01:07

Bonjour,

voila jéssay de faire une regex mais je n'arive pas au résultat que je veut.

voila j'ai un text ex
<?php

$chaine = 'je vers je aller sortir voila c\'est fini je suis suis je comme quoi 
je devien fou alors aider moi je suis pas bien heu si si trés pas bien, mais 
qu\'est ce que je raconte ?';

// je veut retirer les mots (suis, je, aider)
// au départ je fesai comme ça

$chaine = str_replace (' suis ', ' ', $chaine);
$chaine = str_replace (' je ', ' ', $chaine);
$chaine = str_replace (' aider ', ' ', $chaine);

// seulement voila je doit avoir 50 ligne comme ça
// alors j'ai décider de trouver quelque chose de simple et rapide.

//j'ai opter pour ça

$chaine = preg_replace('! suis | je | aider !i', ' ', $chaine);
// seulement voila il me supprime pas tout les (je, suis, aider)

?>
voila ca fait maintenan 2h que je suis entrain de chercher et j'ai pas avancer depuis.
une petite aide ca m'aiderai bien

ViPHP
ViPHP | 1380 Messages

08 janv. 2006, 09:49

Il n'y a pas d'erreur de syntaxe dans ta regex mais bien de logique. C'est assez curieux à première vue, mais normal. Un preg_replace repère d'abord toutes les occurrences d'un motif et ensuite seulement procède au remplacement.

Donc dans son travail de repérage des chaînes à remplacer, tu lui demandes de capturer, par exemple le mot suis précédé et suivi par un espace.

Il va repérer:

je vers je aller sortir voila c\'est fini je suis suis je comme quoi...

Tu remarqueras que les autres je, suis ne sont plus précédés par un espace! Ils ne seront donc pas repérés et remplacés.

Bon, comment faire alors? Comme toujours en regex, plusieurs possibilités:
  • Utiliser l'assertion magique \b qui marque une séparation de mot (y compris la ponctuation) et qui ne consomme pas de caractères (important!):
    $chaine = preg_replace('#\b(suis|je|aidez)\b#', null, $chaine);
    
    // ou, pour gagner (un poil) en rapidité, retirer le caractère capturant des parenthèses.
    $chaine = preg_replace('#\b(?:suis|je|aidez)\b#', null, $chaine);
  • Le plus rapide (de 2 à 10 fois plus rapide selon la longueur du texte).
    Faire plusieurs preg_replace plutôt qu'un seul:
    $mots = array('#\bsuis\b#', '#\bje\b#', '#\baidez\b#');
    $chaine = preg_replace($mots, null, $chaine);
ripat

Eléphant du PHP | 101 Messages

09 janv. 2006, 01:23

Salut,

Merci beaucoup pour ton aide je mensore bien maintenan
j'ai appri comment faire maintenant grace a toi.

quand est ce que je vais devenir un crack du php comme ca moi aussi
j'aiderai les autre sur ce forum ? bientot j'espere.


merci