fonction qui cherche/coupe

HD
Mammouth du PHP | 1181 Messages

10 août 2005, 06:36

salut
svp j'ai besoin d'un petit bout de code qui va lire par exemple la phrase :
$phrase = "     quelques mots   " ;
et qui va :
- compter le nombre d'espaces avant le 1er caractere et apres le dernier caractere ;
- puis supprimer ces espaces pour ne laisser que
quelques mots
dans cet exemple.
merci !

ViPHP
ViPHP | 1380 Messages

10 août 2005, 08:16

Une solution possible:
$phrase = "     quelques mots   " ;

// découpage
preg_match('#^( {2,})(.+?)( {2,})$#s', $phrase, $out);

// affichage
echo '<br />Nb espaces avant texte: '.strlen($out[1]);
echo '<br />Nb espaces après texte: '.strlen($out[3]);

// remplacement 
$phrase = preg_replace('# {2,}#', null, $phrase);
ripat

HD
Mammouth du PHP | 1181 Messages

10 août 2005, 21:00

merci
si l'on pouvait m'expliquer la ligne
preg_match('#^( {2,})(.+?)( {2,})$#s', $phrase, $out);
:oops:

Mammouth du PHP | 19672 Messages

10 août 2005, 21:12

preg_match('#^( {2,})(.+?)( {2,})$#s', $phrase, $out);
  • preg_match est le nom de la fonction qui vérifie la présence du masque dans la chaine:
  • # au début et à la fin sont les délimiteurs du masque;
  • ^ marque le début du masque (attention, dans certain cas, ça marque une
  • négation quand c'est positionné ailleurs dans le masque)
  • $ marque la fin du masque
  • ( {2,}) Indique un espace à 2 ou + exemplaires;
  • (.+?) Indique la présence de n'importe quel caractère à 1 ou + exemplaires;
  • ( {2,}) Même chose que précédemment;
  • s est un paramètre d'expression régulière pour indiquer "tout caractère blanc"
  • $phrase est la chaine à vérifier;
  • $out ... là, j'avoue que je sais pas :oops:
Enfin, tu devrais regarder le tuto de Ripat
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

HD
Mammouth du PHP | 1181 Messages

10 août 2005, 21:38

oui merci c'est bcp plus clair maintenant
out c'est (je crois) pour mettre les espaces à effacer (avant et apres les caracteres)

ViPHP
ViPHP | 1380 Messages

11 août 2005, 09:45

$out est le tableau où seront stockés:
  • $out[0] toute la concordance au motif (dans ce cas, toute la $phase)
  • $out[x] les captures (ce qui est encadré par les parenthèses - ici il y a 3 captures)
On peut ainsi compter le nombre de caractères de la première capture $out[1] et de la troisième $out[3].

L'option s qui suit le délimiteur # veut dire "dot matches new line". Le point, par défaut ne prendra pas le retour ligne. En mettant cette option, la regex ne s'arrêtera pas à un retour ligne éventuel en plein milieu de la $phrase.

Pour les amateurs de fonctions de chaîne et de boucles, il y a aussi une solution:
$phrase = "     quelques mots   " ;
$phraseInverse = strrev($phrase);
$longueur = strlen($phrase);
$nbEspacesAvant = $nbEspacesApres = 0;

for ($i = 0; $i <= $longueur; $i++){
  if ($phrase{$i} != ' ' && $nbEspacesAvant == 0){
    $nbEspacesAvant = $i;
  }
  if ($phraseInverse{$i} != ' '  && $nbEspacesApres == 0){
    $nbEspacesApres = $i;
  }
}

echo '<br />Nb espaces avant texte: '.$nbEspacesAvant;
echo '<br />Nb espaces après texte: '.$nbEspacesApres;

Je ne sait pas ce qui sera le plus rapide. Je testerai ce matin et posterai la réponse.
ripat

ViPHP
ViPHP | 1380 Messages

11 août 2005, 11:37

Voilà, la solution regex est entre 2 fois et 10 fois plus rapide selon la longueur du texte. Plus le texte est court, plus la solution regex est rapide.

Bon, j'avoue que ma solution chaîne de caractères n'est pas particulièrement optimisée mais je jure que c'est involontaire. (non, non, je pousse pas à l'utilisation des regex :wink:)

Pour prouver ma bonne foi, voici une fonction chaîne plus efficace:
  $longueur = strlen($phrase);
  for ($i = 0; $i <= $longueur; $i++){
    if ($phrase{$i} != ' '){
      $nbEspacesAvant = $i;
      break;
    }
  }
  for ($i = longueur - 1; $i >= 0; $i--){
    if ($phrase{$i} != ' '){
      $nbEspacesApres = $longueur - $i;
      break;
    }
  }
Celle-ci est la plus rapide sur les chaînes longues, mais pas sur les courtes!
ripat

Invité
Invité n'ayant pas de compte PHPfrance

11 août 2005, 14:14

ok merci bcp cé sympa tant d'efforts !