[Regexp] Supprimer tous les espaces,\t,\n\r en dehors des balises

Supprimer tous les espaces,\t,\n\r en dehors des balises [Regexp] - Divers - Programmation

Marsh Posté le 08-03-2004 à 15:45:08    

Coucou :hello:  
 
Voilà, j'suis un bleu en regexp c'est pkoi j'vous demande un petit coup de pouce [:*syl*]  
 
Je voudrais faire une regexp qui prend du xhtml en entrée et qui vire tous les espaces, \t, \r, \n en dehors des balises..
 
Exemple bidon pour ceux qui ont pas compris :

  <p>coin coin</p>  <span id="plop">PlOp</span>
   <p>coin coin</p>  <span id="plop">PlOp</span>


donne

<p>coin coin</p><span id="plop">PlOp</span><p>coin coin</p>  <span id="plop">PlOp</span>


 
J'ai maté un peu le source de Smarty (fichier Smarty_Compiler.class.php) mais euh.. :whistle:

Code :
  1. $compiled_content = '';
  2.         /* Interleave the compiled contents and text blocks to get the final result. */
  3.         for ($i = 0, $for_max = count($compiled_tags); $i < $for_max; $i++) {
  4.             if ($compiled_tags[$i] == '') {
  5.                 // tag result empty, remove first newline from following text block
  6.                 $text_blocks[$i+1] = preg_replace('!^(\r\n|\r|\n)!', '', $text_blocks[$i+1]);
  7.             }
  8.             $compiled_content .= $text_blocks[$i].$compiled_tags[$i];
  9.         }
  10.         $compiled_content .= $text_blocks[$i];
  11.         /* Reformat data between 'strip' and '/strip' tags, removing spaces, tabs and newlines. */
  12.         if (preg_match_all("!{$ldq}strip{$rdq}.*?{$ldq}/strip{$rdq}!s", $compiled_content, $_match)) {
  13.             $strip_tags = $_match[0];
  14.             $strip_tags_modified = preg_replace("!{$ldq}/?strip{$rdq}|[\t ]+$|^[\t ]+!m", '', $strip_tags);
  15.             $strip_tags_modified = preg_replace('![\r\n]+!m', '', $strip_tags_modified);
  16.             for ($i = 0, $for_max = count($strip_tags); $i < $for_max; $i++)
  17.                 $compiled_content = preg_replace("!{$ldq}strip{$rdq}.*?{$ldq}/strip{$rdq}!s",
  18.                                                   $this->_quote_replace($strip_tags_modified[$i]),
  19.                                                   $compiled_content, 1);
  20.         }


 
Voilà, donc si vous avez des idées/solutions, j'suis preneur :D

Reply

Marsh Posté le 08-03-2004 à 15:45:08   

Reply

Marsh Posté le 08-03-2004 à 15:52:37    

tiens essaye avec ça:

Code :
  1. /\/(.*?)\>(\W+?)\</\/$1></gs


ça donne bien ton exemple...
 
Par contre si tu avais eu:

Code :
  1. <p>coin coin</p>  <span id="plop">PlOp  Plop Plop
  2. Plop</span>
  3.    <p>coin coin</p>  <span id="plop">PlOp</span>


tu obtiens:

Code :
  1. <p>coin coin</p><span id="plop">PlOp  Plop Plop
  2. Plop</span><p>coin coin</p><span id="plop">PlOp</span>


si tu voulais pas ça, en t'inspirant de ma regex tu devrais trouver ton bonheur!

Reply

Marsh Posté le 08-03-2004 à 15:54:12    

Sisi c'est exactement ça que je voulais, pas de modifications à l'intérieur des balises, je teste ta regexp pour différents cas et je te dis quoi, merci :)

Reply

Marsh Posté le 09-03-2004 à 08:37:44    

Code :
  1. <?php
  2. $html =  '<p>coin coin</p>  <span id="plop">PlOp</span>
  3.    <p>coin coin</p>  <span id="plop">PlOp</span>' ;
  4.  
  5. echo "<br><br><br>AVANT : <br><br><br>" ;
  6. echo "<pre>$html</pre>" ;
  7. preg_replace('/\/(.*?)\>(\W+?)\</\/$1></gs', '', $html) ;
  8. echo "<br><br><br>APRES : <br><br><br>" ;
  9. echo "<pre>$html</pre>" ;
  10. ?>


 
Il me sort un

Citation :

Warning: Unknown modifier '\' in c:\appserv\www\portail\tests\test_regexp.php on line 9

:/

Reply

Marsh Posté le 09-03-2004 à 09:15:45    

essaye en virant les \ devant les > et les <

Code :
  1. preg_replace('/\/(.*?)>(\W+?)</\/$1></gs', '', $html) ;


en tous cas je l'ai testé en perl et ça marchait.
 
ps: il est pas valide ton xhtml :o

Reply

Marsh Posté le 09-03-2004 à 10:27:07    

Pour les intéressés :

Code :
  1. <?php
  2. $html =  "<p>coin coin</p>  <span id=\"plop\">PlOp</span> <a>test</a>\n\t<plop>toto</plop>";
  3.  
  4. echo "AVANT : " ;
  5. echo "<pre>$html</pre>" ;
  6. $html = preg_replace("/(.*> )(\s*)(< )/U", "\\1\\3", $html) ;
  7. echo "\nAPRES : " ;
  8. echo "<pre>$html</pre>" ;
  9. ?>


 
Ça n'a plus rien à voir avec ta regexp Anapajari mais merci qd même pour ton aide :jap:

Reply

Marsh Posté le 09-03-2004 à 10:32:35    

boaaah ça ressemble quand même...
Perso par contre je mettrais (\s+) sinon il va effectuer le traitement chaque fois qu'il trouvera >< dans ta variable!

Reply

Marsh Posté le 09-03-2004 à 10:35:39    

Ok, j'ai fais la modif, merci du conseil :)

Reply

Sujets relatifs:

Leave a Replay

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