fonction qui cherche/coupe

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : fonction qui cherche/coupe

par Invité » 11 août 2005, 14:14

ok merci bcp cé sympa tant d'efforts !

par Ripat » 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!

par Ripat » 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.

par HD » 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)

par Cyrano » 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

par HD » 10 août 2005, 21:00

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

par Ripat » 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);

fonction qui cherche/coupe

par HD » 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 !