[php]preg_replace et limite | help me and get a free cookie

preg_replace et limite | help me and get a free cookie [php] - PHP - Programmation

Marsh Posté le 20-12-2004 à 13:14:07    

bonjour , voici mon probleme : (lu sur php.net)
 

It is useful to note that the 'limit' parameter, when used with 'pattern' and 'replace' which are arrays, applies to each individual pattern in the patterns array, and not the entire array.
<?php
 
$pattern = array('/one/', '/two/');
$replace = array('uno', 'dos');
$subject = "test one, one two, one two three";
 
echo preg_replace($pattern, $replace, $subject, 1);
?>
 
If limit were applied to the whole array (which it isn't), it would return:
test uno, one two, one two three
 
However, in reality this will actually return:
test uno, one dos, one two three


 
 
je voudrais que :

it would return:
test uno, one two, one two three


 
comment faire ?
merci de votre aide , et pas d'insultes plz :(


Message édité par glabibou le 27-12-2004 à 15:12:57
Reply

Marsh Posté le 20-12-2004 à 13:14:07   

Reply

Marsh Posté le 20-12-2004 à 13:27:23    

Je me pose la même question (parsing de smilies) et je n'ai pas réussi à trouver de solution simple ...


---------------
Tant que la couleur de la peau sera plus importante que celle des yeux, nous ne connaitrons pas la paix. ● L'écriture, c'est la mémoire du futur. ● Mods FO4
Reply

Marsh Posté le 20-12-2004 à 13:36:01    

oui moi aussi c'est dans le cadre de la limitation de smileys

Reply

Marsh Posté le 20-12-2004 à 13:43:23    

je pourrais faire un str_replace , compter le nombre d'occurences de smileys, mais ensuite ?
je vais quand meme pas effacer tous les messages qui ont plus de 4 smileys par exemple, faut que je lui dise de pas remplacer au dessus de 4 smileys..
hum.. comment faire..

Reply

Marsh Posté le 20-12-2004 à 13:52:56    

je ne comprends pas le problème ... Ca marche pas comme c'est dit plus haut ?

Reply

Marsh Posté le 20-12-2004 à 14:05:57    

bah moi je veux que ca retourne "test uno, one two, one two three" a la place de "test uno, one dos, one two three "

Reply

Marsh Posté le 20-12-2004 à 14:07:17    

en fait j'ai deux tableaux : un avec les codes des smileys et lautre avec l'url des smileys, je voudrais limiter le nombre de smileys a 4 par exemple.
si je mets
preg_replace($pattern, $replace, $subject, 4);  
lutilisateur pourra mettre au maximum 4 fois le meme smiley, mais si j'ai une liste de 12 smiley il pourra en mettre 48 ! alors que moi je veux 4 au maximum !

Reply

Marsh Posté le 27-12-2004 à 15:08:49    

j'ai tjrs pas résolu le probleme :(
qqun aurait-il une solution ?
(ceci est un up)

Reply

Marsh Posté le 27-12-2004 à 19:52:56    

Bonne question en effet...
 
Si preg_replace au moins renvoyait le nombre de remplacements qu'il a effectivement faits, comme str_replace, alors il serait possible de se faire sa version de la fonction (en chaînant des appels pour chaque smiley, ce qui ne serait peut-être pas optimal cela dit).
 
Mais là, comme ça, je vois pas. J'ai fait une rapide recherche sur Google et je n'ai rien trouvé, ce qui me paraît assez étonnant... [:figti]


Message édité par sielfried le 27-12-2004 à 19:53:18

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 27-12-2004 à 20:05:58    

merci pour ta réponse en tout cas :)
voila pour toi :
http://www.creativetheatre.org/images/cookie.jpg


Message édité par glabibou le 27-12-2004 à 20:13:19
Reply

Marsh Posté le 27-12-2004 à 20:05:58   

Reply

Marsh Posté le 27-12-2004 à 20:25:08    

:love:
 
Réserves-en un autre, j'ai peut-être trouvé une solution viable, il me faut juste quelques minutes. :d
 
Edit: en fait j'ai trouvé une alternative, mais elle impose une "priorité" aux masques (smilies) : s'il y'a ": ) : ) : d : )" et une limite de 3, on va obtenir ":) :) : d :)" (si ": )" se trouve avant le ": d" dans le tableau). Ce qui n'est pas génial. :/


Message édité par sielfried le 27-12-2004 à 20:52:33

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 27-12-2004 à 21:15:27    

c'est pas grave, c'est deja mieux que rien !!
si tu me donnes ta solution t'as un cookie encore plus gros :)

Reply

Marsh Posté le 27-12-2004 à 22:24:39    

Code :
  1. function preg_replace_alt($pattern, $replace, $subject, $limit) {
  2. if (!is_array($pattern) || !is_array($replace)) {
  3.  return preg_replace($pattern, $replace, $subject, $limit);
  4. }
  5. $nb_masques = count($pattern);
  6. for ($i = 0; $i < $nb_masques && $limit > 0; $i++) {
  7.  $nb_rempl = preg_match_all($pattern[$i], $subject, $dummy);
  8.  $subject = preg_replace($pattern[$i], $replace[$i], $subject, $limit);
  9.  $limit -= $nb_rempl;
  10. }
  11. return $subject;
  12. }


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 26-05-2005 à 14:05:39    

Hmmm en lisant le bout de code au dessus ça me parait clair (on décrémente au fur et à mesure le nb de parsing restant en fait). A voir et à tester.


---------------
Tant que la couleur de la peau sera plus importante que celle des yeux, nous ne connaitrons pas la paix. ● L'écriture, c'est la mémoire du futur. ● Mods FO4
Reply

Marsh Posté le 27-05-2005 à 09:02:33    

Hmmm ...
 
Peut être que l'on peut voir cela suivant une fonction modifiée (utilisation d'une table smilies pour être précis).


---------------
Tant que la couleur de la peau sera plus importante que celle des yeux, nous ne connaitrons pas la paix. ● L'écriture, c'est la mémoire du futur. ● Mods FO4
Reply

Marsh Posté le 25-06-2005 à 09:32:18    

J'avais perdu de vue ce topic. :D
 
Je viens de me creuser la tête quelques minutes et je pense avoir trouvé une idée qui fonctionne :
 

Code :
  1. function preg_replace_alt_v2($pattern, $replace, $subject, $limit) {
  2.    // Si l'un des deux premiers arg. n'est pas un tableau, utiliser la fonction par défaut
  3.    if (!is_array($pattern) || !is_array($replace)) {
  4.     return preg_replace($pattern, $replace, $subject, $limit);
  5.    }
  6.  
  7.    // Si le tableau des patterns et celui des remplacements ne font pas la même taille, erreur
  8.    $pattern_cnt = count($pattern);
  9.    $replace_cnt = count($replace);
  10.    if ($pattern_cnt != $replace_cnt) {
  11.       trigger_error("preg_replace_alt_v2 : les tableaux 'pattern' et 'replace' doivent faire la même taille.", E_USER_ERROR);
  12.    }
  13.  
  14.    // Création du masque pour preg_split : concaténation de tous les masques
  15.    $masque = substr($pattern[0], 1, -1);
  16.    for ($i = 1; $i < $pattern_cnt; $i++) {
  17.       $masque .= '|' . substr($pattern[$i], 1, -1);
  18.    }
  19.    $masque = '#(' . $masque . ')#';
  20.    // Adaptation de la limite demandée à preg_split avec PREG_SPLIT_DELIM_CAPTURE
  21.    $limit *= 2;
  22.    // Découpage de la chaîne en fonction de la limite demandée
  23.    $tab = preg_split($masque, $subject, $limit, PREG_SPLIT_DELIM_CAPTURE);
  24.    // Les cases impaires contiennent les éléments à remplacer
  25.    $tab_cnt = count($tab);
  26.    $imax = ($limit < $tab_cnt) ? $limit : $tab_cnt;
  27.    for ($i = 1; $i < $imax; $i += 2) {
  28.       $tab[$i] = preg_replace($pattern, $replace, $tab[$i]);
  29.    }
  30.    // On retourne la concaténation de tous les éléments du tableau
  31.    return implode('', $tab);
  32. }


 
Y'a probablement beaucoup mieux/optimisé (surtout moins bidouille), mais en attendant ça a l'air de marcher pas trop mal. ;)


Message édité par sielfried le 25-06-2005 à 09:42:51

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed