Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1148 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°232478
z0rglub
Posté le 22-10-2002 à 16:20:11  profilanswer
 

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
mood
Publicité
Posté le 22-10-2002 à 16:20:11  profilanswer
 

n°232502
Fred999
Rabat-joie
Posté le 22-10-2002 à 16:36:41  profilanswer
 
n°232510
z0rglub
Posté le 22-10-2002 à 16:38:56  profilanswer
 

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
n°232516
art_dupond
je suis neuneu... oui oui !!
Posté le 22-10-2002 à 16:41:15  profilanswer
 

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
n°232521
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 22-10-2002 à 16:42:43  profilanswer
 

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.
n°232522
Fred999
Rabat-joie
Posté le 22-10-2002 à 16:42:53  profilanswer
 

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

n°232523
--greg--
Posté le 22-10-2002 à 16:43:27  profilanswer
 

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!
n°232524
art_dupond
je suis neuneu... oui oui !!
Posté le 22-10-2002 à 16:43:50  profilanswer
 

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


---------------
oui oui
n°232527
z0rglub
Posté le 22-10-2002 à 16:45:56  profilanswer
 

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
n°232539
format_c
Plouf plouf ...
Posté le 22-10-2002 à 16:57:57  profilanswer
 

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...

mood
Publicité
Posté le 22-10-2002 à 16:57:57  profilanswer
 

n°232540
[SDF]Poire
Vive Grumly
Posté le 22-10-2002 à 16:58:08  profilanswer
 

:hello:


---------------
Des bons sites pour Delphi? http://forum.hardware.fr/forum2.php3?post=16838&cat=10 -- informaticien -- http://www.z0rglub.com/phpwebgallery/ -- Delphi :love:
n°232546
z0rglub
Posté le 22-10-2002 à 17:01:51  profilanswer
 

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
n°232554
format_c
Plouf plouf ...
Posté le 22-10-2002 à 17:04:59  profilanswer
 

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
n°232557
z0rglub
Posté le 22-10-2002 à 17:06:46  profilanswer
 

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
n°232560
format_c
Plouf plouf ...
Posté le 22-10-2002 à 17:12:16  profilanswer
 

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
n°232562
z0rglub
Posté le 22-10-2002 à 17:15:38  profilanswer
 

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
n°232564
omega2
Posté le 22-10-2002 à 17:24:51  profilanswer
 

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é.

n°232565
z0rglub
Posté le 22-10-2002 à 17:25:38  profilanswer
 

c strpos


---------------
Ma galerie photo créée avec Piwigo et hébergée sur Piwigo.com
n°232575
--greg--
Posté le 22-10-2002 à 18:05:16  profilanswer
 

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!
n°232597
ethernal
Chercheur de vérité...
Posté le 22-10-2002 à 18:58:04  profilanswer
 

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...
n°232598
z0rglub
Posté le 22-10-2002 à 18:59:12  profilanswer
 

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
n°232613
format_c
Plouf plouf ...
Posté le 22-10-2002 à 19:31:56  profilanswer
 

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

n°232616
z0rglub
Posté le 22-10-2002 à 19:36:45  profilanswer
 

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
n°232738
ethernal
Chercheur de vérité...
Posté le 23-10-2002 à 01:20:52  profilanswer
 

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...
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

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

 

Sujets relatifs
[PHP] Problème de configuration de PHP sur ma machineInstanciation d'une classe en fonction d'un type en C#
Bonsoir, pouvez vous améliorer mon petit script svp?[PHP] Redimentionner une image sans passer par imagecreatetruecolor()
Cherche aide en PHP pour débutants...forum en PHP
Recherche codeur PHP pour le site d'une grande team RtCW (wolfenstein)C koi le prob avec ma fonction ?
[PHP] Pas urgent, juste par curiosité : les liens...Jeu de plateau en PHP !!!
Plus de sujets relatifs à : [PHP] aidez moi à améliorer une fonction :( regex ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR