IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Insérer une ligne toutes les n lignes dans un tableau [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Par défaut Insérer une ligne toutes les n lignes dans un tableau
    Bonjour
    Je cherche à insérer un saut de page toutes les n lignes dans un tableau existant.
    J'ai écrit ce code, qui fonctionne très bien pour insérer toutes les 3 lignes, mais pas au-delà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $patterns = "#(<tr.+(?<!\?)>.+</tr>.+<tr.+(?<!\?)>.+</tr>.+)<tr(.+(?<!\?)>.+</tr>)#Us";
    $replace = "\\1 <tr style='page-break-after:always' \\2'> ";
    $_SESSION['contents'] = preg_replace($patterns, $replace, $_SESSION['contents']);
    Quelqu'un saurait-il pourquoi ça ne fonctionne plus si je mets plus de 3 lignes dans mon pattern, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $patterns = "#(<tr.+(?<!\?)>.+</tr>.+<tr.+(?<!\?)>.+</tr>.+<tr.+(?<!\?)>.+</tr>.+)<tr(.+(?<!\?)>.+</tr>)#Us";
    Quelqu'un aurait-il une solution fonctionnelle pour écrire du texte toutes les n lignes ?

    Merci d'avance


    Post-scriptum :
    C'est exactement pareil avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $patterns = "#(<tr.+(?<!\?)>.+</tr>.+){2}<tr(.+(?<!\?)>.+</tr>)#Us";
    Si je remplace 2 par 3, ça ne marche plus.

  2. #2
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    a priori tu peux t'inspirer des fonctions postées ici.
    Faire ça en une seule regex me semble un peu chaud, peut être en regardant du côté des conditions mais il faudrait pouvoir récupérer directement le nombre d'occurrences dans le pattern, je ne sais pas si c'est possible.
    Bye

  3. #3
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Ca pourrait donner ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $str = '<table><tr><td>-</td></tr><tr><td>-</td></tr><tr><td>-</td></tr><tr><td>-</td></tr><tr><td>-</td></tr><tr><td>-</td></tr><tr><td>-</td></tr></table>';
     
    function formatpos($match, $str, $step)	{
    	$offset = -1;
    	$i = 1;
    	while(($offset = strpos($str, $match, $offset + 1)) !== false)	{
    		if($i % $step == 0)	{
    			$str = substr_replace($str, $match." style='font-size: 40px;'", $offset, strlen($match));
    		}
    		$i++;
    	}
    	return $str;
    }
     
    echo formatpos("<tr", $str, 2);

  4. #4
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Par défaut
    Merci beaucoup, ça fonctionne bien. C'est un peu sale comparé à la pureté des regex, mais c'est très bien !
    Par curiosité, ça ne m'explique pas pourquoi ma regex ne fonctionne pas au-delà de 2 lignes.

  5. #5
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Arf je suis grave j'avais zappé les quantificateurs {} en fait c'est tout simple ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_replace("#((<tr.*</tr>.*){3})<tr(.*</tr>)#Us", "$1<tr style='page-break-after:always' $3", $str);
    Pour info ta regex d'origine ne fonctionne pas chez moi même avec {2}, elle bouffe des lignes, et d'ailleurs je ne comprends pourquoi t'utilises des assertions ? Je crois que si elle plante c'est dû au fait que quand tu fais par exemple (chaine){2} il te crée 2 références donc tu te retrouves avec \\1 et \\2 (et \\3 pour la dernière chaîne) mais tu n'utilises que \\1 et \\2 dans ton remplacement. A confirmer...

  6. #6
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Par défaut
    quand tu fais par exemple (chaine){2} il te crée 2 références
    Je crois que tu as mis le doigt sur le problème, merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Résultat d'une moyenne toutes les 5 lignes
    Par fennec62 dans le forum Débuter
    Réponses: 1
    Dernier message: 02/08/2014, 23h10
  2. Réponses: 2
    Dernier message: 21/02/2014, 13h33
  3. Faire une somme toutes les n lignes
    Par collosus dans le forum R
    Réponses: 3
    Dernier message: 30/04/2013, 14h19
  4. Ne pas afficher les lignes et les colonnes interne dans un tableau HTML
    Par Jinx_ dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/01/2010, 21h23
  5. [E-03] copier une cellule toutes les 7 lignes
    Par hdisnice dans le forum Excel
    Réponses: 7
    Dernier message: 22/03/2009, 12h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo