[PHP] aidez moi à améliorer une fonction :( regex ?

aidez moi à améliorer une fonction :( regex ? [PHP] - PHP - Programmation

Marsh Posté le 22-10-2002 à 16:20:11    

salut à tous, j'ai une fonction qui prend bcp de temps à s'exécuter et j'aimerais trouver une optimisation.

Code :
  1. // - The function replace_space replace caracters space and -  
  2. // in a string by their HTML equivalent : &nbsb; et &minus
  3. // - The function do not replace caracters in HTML tags
  4. // - This function was created be cause IE5 did not respect
  5. // the CSS property white-space : nowrap; unless space and minus
  6. // caracter are replaced like this function does
  7. function replace_space( $string )
  8. {
  9.  $new_string = "";
  10.  $in_tag = false;
  11.  for( $i = 0; $i < strlen( $string ); $i++ )
  12.  {
  13.   if ( !$in_tag )
  14.   {
  15.    if ( $string[$i] == " " ) $new_string.= " ";
  16.    else if ( $string[$i] == "-" ) $new_string.= "−";
  17.    else $new_string.= $string[$i];
  18.   }
  19.   else
  20.   {
  21.    $new_string.= $string[$i];
  22.   }
  23.   if ( $string[$i] == "<" )
  24.   {
  25.    $in_tag = true;
  26.   }
  27.   if ( $string[$i] == ">" )
  28.   {
  29.    $in_tag = false;
  30.   }
  31.  }
  32.  return $new_string;
  33. }


 
exemple d'utilisation :  

Code :
  1. replace_space( "Aucune rubrique n'est selectionnée,<br />veuillez en choisir une dans le menu." )
  2. donnera :
  3. Aucune rubrique n'est selectionnée,<br />veuillez en choisir une dans le menu.


Vous voyez comment faire plus propre et surtout plus rapide ?


Message édité par z0rglub le 22-10-2002 à 16:44:29

---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 22-10-2002 à 16:20:11   

Reply

Marsh Posté le 22-10-2002 à 16:36:41    

Reply

Marsh Posté le 22-10-2002 à 16:38:56    

Fred999 a écrit a écrit :

str_replace ne marche pas? :??:
 
http://www.php.net/manual/fr/function.str-replace.php




c ce que je faisais au début, mais le pb, c'est qu'il remplace partout, sans discerner les balises HTML du reste de la chaîne. Et moi je ne veux rien modifier dans les balises HTML, juste à l'extérieur.


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 22-10-2002 à 16:41:15    

y a pas une fonction qui fait ca, sauf les balise que tu lui dis d'ignorer ? (je me rappelle plus du nom par contre)


---------------
oui oui
Reply

Marsh Posté le 22-10-2002 à 16:42:43    

Je vois mal comment optimiser une telle fonction. Son seul et principal avantage par rapport à str_replace() c'est justement le fait que les balises HTML sont détectées. Et pour ça, pas de miracle, faut parser la chaîne caractère par caractère.
Je pense qu'il doit être possible de faire une expression régulière qui te fasse tout le boulot d'un seul coup, mais je ne connais pas assez bien ce mécanisme pour t'aider :D  
Enfin bref, si optimisation il y a, cherche du côté des expressions régulières, pas de l'algorithmie.


---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 22-10-2002 à 16:42:53    

Alors, il faudrait séparer les balises HTML du reste, et recoller les morceaux après...
 
Sinon, j'vois pas bien comment faire + vite :??:

Reply

Marsh Posté le 22-10-2002 à 16:43:27    

z0rglub a écrit a écrit :

 
// - The function replace_space replace caracters space and -  
 // in a string by their HTML equivalent : &nbsb; et &minus
 




- The replace_space function replaces space and '-' characters by their HTML equivalent  &nbsb; and −

z0rglub a écrit a écrit :

 
// - The function do not replace caracters in HTML tags




- The function does not replace characters in HTML tags

z0rglub a écrit a écrit :

 
// - This function was created be cause IE5 did not respect
 // the CSS property white-space : nowrap; unless space and minus
 // caracter are replaced like this function does




- This function was created because IE5 does not respect the CSS "white-space: nowrap;" property unless space and minus characters are replaced like this function does.
 
 
C'est déjà mieux comme ça ;)
 
:D


Message édité par --greg-- le 22-10-2002 à 16:44:39

---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 22-10-2002 à 16:43:50    

je retombe plus sur la fonction. Je me demande si je l'ai vraiment vue :p


---------------
oui oui
Reply

Marsh Posté le 22-10-2002 à 16:45:56    

greg a écrit a écrit :

C'est déjà mieux comme ça ;)
 
:D




t'as carrément raison de me corriger mes fautes d'anglais. C sympa.  :)
tu maîtriserais pas les regex en plus :D ?


Message édité par z0rglub le 22-10-2002 à 16:47:03

---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 22-10-2002 à 16:57:57    

Pourquoi ne pas essayer ça :
Ex de texte
$chaineinitiale= efnpeznf ipeznfp inezinf p http://www.fzefezf.com efnpeznf ipeznfp inezinf p efnpeznf ipeznfp inezinf p efnpeznf ipeznfp inezinf p efnpeznf ipeznfp inezinf p http://www.fefef.com zefezfezf hytjk-uokyi
 
Pour le traiter :
1er-> Cherche la première Occurence [URL]
2ème -> Affecter à une variable $chainetraitee la chaine 0 jusqu'à la position de renvoyée précédemment.
3ème - [...]  occurence

5ème -> $chainetraitee= valeur de la chaine entre Pos[url] et Pos [/URL+4]
6ème -> $Chainefinale=$Chainefinale.$chainetraitee
7ème-> $Chaineinitiale= valeur de $chaineinitiale entre Pos[/URL+4] jusqu'à la fin
Et ainsi de suite...

Reply

Marsh Posté le 22-10-2002 à 16:57:57   

Reply

Marsh Posté le 22-10-2002 à 16:58:08    

:hello:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
Reply

Marsh Posté le 22-10-2002 à 17:01:51    

Format_c a écrit a écrit :

Pourquoi ne pas essayer ça :
Ex de texte

Code :
  1. $chaineinitiale= efnpeznf ipeznfp inezinf p http://www.fzefezf.com efnpeznf ipeznfp inezinf p efnpeznf ipeznfp inezinf p efnpeznf ipeznfp inezinf p efnpeznf ipeznfp inezinf p http://www.fefef.com zefezfezf hytjk-uokyi


 
Pour le traiter :
1er-> Cherche la première Occurence [URL]
2ème -> Affecter à une variable $chainetraitee la chaine 0 jusqu'à la position de renvoyée précédemment.
3ème - [...]  occurence

5ème -> $chainetraitee= valeur de la chaine entre Pos[url] et Pos [/URL+4]
6ème -> $Chainefinale=$Chainefinale.$chainetraitee
7ème-> $Chaineinitiale= valeur de $chaineinitiale entre Pos[/URL+4] jusqu'à la fin
Et ainsi de suite...
 




y'a de l'idée, faut voir si j'y arrive.


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 22-10-2002 à 17:04:59    

z0rglub a écrit a écrit :

 
y'a de l'idée, faut voir si j'y arrive.




Mon explication et fouilli mais c'est juste une boucle utilisant 2 fonctions en pratique :D
Le but étant de construire $ChaineFinale à artir d'un $Chaineinitiale qui rétrécit au fure et à mesure.
PS : pour savoir combien de fois il faut boucler, il faut compter le nbre d'occurences ou ;)


Message édité par format_c le 22-10-2002 à 17:06:35
Reply

Marsh Posté le 22-10-2002 à 17:06:46    

non non, t'as très bien expliqué, pas de pb. Je vais considérer qu'une balise HTML commence par "<" et finit par ">", si qqun s'amuse à mettre des caractères comme ça (au lieu des < et > ), ça déconnera, mais c pas grave...


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 22-10-2002 à 17:12:16    

z0rglub a écrit a écrit :

non non, t'as très bien expliqué, pas de pb. Je vais considérer qu'une balise HTML commence par "<" et finit par ">", si qqun s'amuse à mettre des caractères comme ça (au lieu des < et > ), ça déconnera, mais c pas grave...




Ne mais pas seulement < et > !!!
Si jamais ta balise est <HTML></HTML> ça prendra en compte le premier < et le 1er >, c'est à dire celui qui est en pos 5 et pas en dernière...
Mais la balise complète, c'est plus sûr :)
Si t'as peur que quelqu'un mette une balise de ce type qui fasse foirer, t'as qu'à remplacer dans la variable non encore traitée (celle que renvoie l'Input) ces balises par '' et ensuite tu fait ton traitement qui te renverra $ChaineInitiale


Message édité par format_c le 22-10-2002 à 17:14:39
Reply

Marsh Posté le 22-10-2002 à 17:15:38    

non non, j'autorise toutes les balises html (c pas pour un forum, seuls les admins peuvent toucher le texte)


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 22-10-2002 à 17:24:51    

z0rglub a écrit a écrit :

 
y'a de l'idée, faut voir si j'y arrive.



strpos ou str_pos
je sais plus l'ortographe exacte de la fonction mais c'est celle qui permet de trouver une chaine de caractère dans une autre a partir d'une position donné.

Reply

Marsh Posté le 22-10-2002 à 17:25:38    

c strpos


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 22-10-2002 à 18:05:16    

z0rglub a écrit a écrit :

 
t'as carrément raison de me corriger mes fautes d'anglais. C sympa.  :)
tu maîtriserais pas les regex en plus :D ?



po du tout :D
(ça existe des gens qui maitrisent vraiment ça ?? [:totoz])


---------------
#19b | Mardi 18 Février 2003 - nous fêtons les Bernadette | contre le fleur icq!
Reply

Marsh Posté le 22-10-2002 à 18:58:04    

hum...
g pas le temps de faire un algo, mais ça ressemble un peu à ce que j'ai fait pour optimiser fastTemplates.
- découpe en tableau
- parse des parties intéressantes
- implode une fois fini.
 
sinon tu peux faire une regexp avec (mais c plus lent)
extraction des (*)<(*)>(*) et exécution d'une fonction sur \\1 et \\3

Code :
  1. preg_replace('/(.+?)<(.+?)>(.+?)/Use', "transformCode('\\1','\\2','\\3')" );
  2. function transformCode($var1, $tag, $var2){
  3.   return str_replace(' ',' ',$var1).$tag.str_replace(' ',' ',$var2);
  4. }


 
 


---------------
...oups kernel error...
Reply

Marsh Posté le 22-10-2002 à 18:59:12    

bon alors voilà ma fonction refaite, qui est bcp plus rapide et plus propre :

Code :
  1. // - The replace_space function replaces space and '-' characters
  2. // by their HTML equivalent  &nbsb; and −
  3. // - The function does not replace characters in HTML tags
  4. // - This function was created because IE5 does not respect the
  5. // CSS "white-space: nowrap;" property unless space and minus
  6. // characters are replaced like this function does.
  7. function replace_space( $string )
  8. {
  9.  $return_string = "";
  10.  $remaining = $string;
  11.  $start = 0;
  12.  $end = 0;
  13.  $start = strpos ( $remaining, "<" );
  14.  $end = strpos ( $remaining, ">" );
  15.  while ( is_numeric( $start ) && is_numeric( $end ) )
  16.  {
  17.   $treatment = substr ( $remaining, 0, $start );
  18.   $treatment = str_replace( " ", " ", $treatment );
  19.   $treatment = str_replace( "-", "−", $treatment );
  20.   $return_string.= $treatment.substr ( $remaining, $start, $end - $start + 1 );
  21.   $remaining = substr ( $remaining, $end + 1, strlen( $remaining ) );
  22.   $start = strpos ( $remaining, "<" );
  23.   $end = strpos ( $remaining, ">" );
  24.  }
  25.  $treatment = str_replace( " ", " ", $remaining );
  26.  $treatment = str_replace( "-", "−", $remaining );
  27.  $return_string.= $treatment;
  28.  return $return_string;
  29. }


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 22-10-2002 à 19:31:56    

z0rglub a écrit a écrit :

bon alors voilà ma fonction refaite, qui est bcp plus rapide et plus propre :




Alors elle est pas belle la vie ? :D

Reply

Marsh Posté le 22-10-2002 à 19:36:45    

Format_C a écrit a écrit :

 
Alors elle est pas belle la vie ? :D




si, j'ai passé du temps dessus, parce qu'il y avait un petit bug de PHP qui considéré que if ( $start = la fonction ) et que la fonction lui retournait 0, ct comme un false...


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
Reply

Marsh Posté le 23-10-2002 à 01:20:52    

z0rglub a écrit a écrit :

 
si, j'ai passé du temps dessus, parce qu'il y avait un petit bug de PHP qui considéré que if ( $start = la fonction ) et que la fonction lui retournait 0, ct comme un false...




 
fo mettre $start!==false, c'est là que ce foutu opérateur === entre en jeux :D


Message édité par ethernal le 23-10-2002 à 01:21:52

---------------
...oups kernel error...
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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