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 :

regex par block [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut regex par block
    bonjour,

    imaginon que j'ai un texte composer de trois paragraphe

    [codehtml]blablablablablablablablablablablablablablablablablablablablablablablablablablablablablablablabla[/codehtml]

    [codejs]lollollollollollollollollollollollollollollollollollollollollollollollollollollollollollollollol[/codejs]

    [codephp]mdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdrmdr[/codephp]

    et que le texte entre les balise [codehtml] execute ceci :
    $texte = preg_replace('#\[lol\](.+)\[/lol\]#isU', '<strong>$1</strong>', $texte);
    et que le texte entre les balise [codejs] execute ceci :
    $texte = preg_replace('#\[lol\](.+)\[/lol\]#isU', '<em>$1</em>', $texte);
    et que le texte entre les balise [codephp] execute ceci :
    $texte = preg_replace('#\[lol\](.+)\[/lol\]#isU', '<u>$1</u>', $texte);
    N'oublie pas le pouce vert

  2. #2
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Hello.

    D'accord, si tu le dis.

    C'est quoi la question ? Dans mon pays on termine les phrases interrogatives par un point d'interrogation.

  3. #3
    Membre éclairé Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Points : 831
    Points
    831
    Par défaut
    Pourquoi avoir ouvert un nouveau post ?
    N'est-ce pas la suite de celui-ci ?

    Un texte qui exécute du code php ?
    Il me semble que cela mérite clarification.

    Fred

  4. #4
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Hello.

    D'accord, si tu le dis.

    C'est quoi la question ? Dans mon pays on termine les phrases interrogatives par un point d'interrogation.
    La question est comment puis-je faire ? svp
    N'oublie pas le pouce vert

  5. #5
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Avec ce que tu nous as donné comme information on ne peut pas te dire comment faire: tu ne nous décrit pas ce que tu veux faire.

    et que le texte entre les balise [codehtml] execute ceci : ...
    N'est pas un explication valide.
    C'est comme si je disait: "Voiture, bannane ! Comment faire ?"

    Je pense que tu voulais dire "Je souhaite encapsuler des portions de texte entre des balises à l'aide d'expression régulières." Je me trompe ?

  6. #6
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut re
    Citation Envoyé par Benjamin Delespierre Voir le message
    Avec ce que tu nous as donné comme information on ne peut pas te dire comment faire: tu ne nous décrit pas ce que tu veux faire.


    N'est pas un explication valide.
    C'est comme si je disait: "Voiture, bannane ! Comment faire ?"

    Je pense que tu voulais dire "Je souhaite encapsuler des portions de texte entre des balises à l'aide d'expression régulières." Je me trompe ?
    je vais m'exprimer plus clairement avec un exemple :

    voici mon texte :

    Je suis un gros [lol][bb]nul[/bb], et pourtant j'ai [ii]tout appris[/ii][/lol][mdr] les [bb]banane[/bb] que c'est bon les [ii]banane[/ii] j'adore[/mdr].

    et j'aimerais que le texte entre les balise [lol][/lol] :
    - on remplace les balise [bb][/bb] par <strong></strong>
    - on remplace les balise [ii][/ii] par <em></em>

    et j'aimerais que le texte entre les balise [mdr][/mdr] :
    - on remplace les balise [bb][/bb] par <em></em>
    - on remplace les balise [ii][/ii] par <strong></strong>

    ... Merci d'avance
    N'oublie pas le pouce vert

  7. #7
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Ah d'accord, tu veux faire ton propre bbcode en fait.

    C'est relativement simple à faire, s'il ne s'agit que de "traduire" les balises bb par des balises XHTML.
    On va pour ça se servir d'un tableau associatif qui nous fournira cette traduction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $bb_tags = array(
    'a' => 'em',
    'b' => 'strong',
    'c' => 'center'
    );
    On va ensuite se servir de ce tableau pour faire les traductions qui vont bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // On construit les patterns de remplacement
    $bb_patterns = array_map(function ($item) { return "#\[$item\](.*)\[/$item\]#im"; }, array_keys($bb_tags));
    var_dump($bb_patterns);
     
    $bb_replace = array_map(function ($item) { return "<$item>$1</$item>"; }, array_values($bb_tags));
    var_dump($bb_replace);
    Les var_dump nous servent à voir que nos patterns de traduction sont corrects:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    array
      0 => string '#\[a\](.*)\[/a\]#im' (length=19)
      1 => string '#\[b\](.*)\[/b\]#im' (length=19)
      2 => string '#\[c\](.*)\[/c\]#im' (length=19)
     
    array
      0 => string '<em>$1</em>' (length=11)
      1 => string '<strong>$1</strong>' (length=19)
      2 => string '<center>$1</center>' (length=19)
    ensuite, y'a plus qu'a appliquer tout ça sur une chaine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $text = <<<TXT
    [a]hello[/a] worldTXT;
    
    var_dump(preg_replace($bb_patterns, $bb_replace, $text));
    Et voilà le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string '<center><em>hello</em> <strong>world</strong></center>' (length=54)
    C'est tout bête

  8. #8
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Ah d'accord, tu veux faire ton propre bbcode en fait.

    C'est relativement simple à faire, s'il ne s'agit que de "traduire" les balises bb par des balises XHTML.
    On va pour ça se servir d'un tableau associatif qui nous fournira cette traduction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $bb_tags = array(
    'a' => 'em',
    'b' => 'strong',
    'c' => 'center'
    );
    On va ensuite se servir de ce tableau pour faire les traductions qui vont bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // On construit les patterns de remplacement
    $bb_patterns = array_map(function ($item) { return "#\[$item\](.*)\[/$item\]#im"; }, array_keys($bb_tags));
    var_dump($bb_patterns);
     
    $bb_replace = array_map(function ($item) { return "<$item>$1</$item>"; }, array_values($bb_tags));
    var_dump($bb_replace);
    Les var_dump nous servent à voir que nos patterns de traduction sont corrects:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    array
      0 => string '#\[a\](.*)\[/a\]#im' (length=19)
      1 => string '#\[b\](.*)\[/b\]#im' (length=19)
      2 => string '#\[c\](.*)\[/c\]#im' (length=19)
     
    array
      0 => string '<em>$1</em>' (length=11)
      1 => string '<strong>$1</strong>' (length=19)
      2 => string '<center>$1</center>' (length=19)
    ensuite, y'a plus qu'a appliquer tout ça sur une chaine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $text = <<<TXT
    [a]hello[/a] worldTXT;
    
    var_dump(preg_replace($bb_patterns, $bb_replace, $text));
    Et voilà le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    string '<center><em>hello</em> <strong>world</strong></center>' (length=54)
    C'est tout bête

    je ne suis que debutant donc desoler mais je n'est vraiment rien compris :s
    N'oublie pas le pouce vert

  9. #9
    Membre éclairé Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Points : 831
    Points
    831
    Par défaut
    Je ne suis que débutant donc désolé mais je n'ai vraiment rien compris :s
    Alors pour commencer, peut-être que ceci fera l'affaire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $texte = "Je suis un gros [lol][bb]nul[/bb], et pourtant j'ai [ii]tout appris[/ii][/lol][mdr] les [bb]banane[/bb] que c'est bon les [ii]banane[/ii] j'adore[/mdr].";
     
    // Je remplace les balises bb comprises entre des balises lol
    $texte = preg_replace('#(\[lol\].*)\[bb\](.*?)\[/bb\](.*\[/lol\])#', '$1<strong>$2</strong>$3', $texte);
    // Je remplace les balises ii comprises entre des balises lol et je supprime les balises lol
    $texte = preg_replace('#\[lol\](.*)\[ii\](.*?)\[/ii\](.*)\[/lol\]#', '$1<em>$2</em>$3', $texte);
     
    // Je remplace les balises bb comprises entre des balises mdr
    $texte = preg_replace('#(\[mdr\].*)\[bb\](.*?)\[/bb\](.*\[/mdr\])#', '$1<strong>$2</strong>$3', $texte);
    // Je remplace les balises ii comprises entre des balises mdr et je supprime les balises mdr
    $texte = preg_replace('#\[mdr\](.*)\[ii\](.*?)\[/ii\](.*)\[/mdr\]#', '$1<em>$2</em>$3', $texte);
    echo $texte;
    Mais, pour généraliser, il me semble pas inutile de se pencher sur la proposition de Benjamin.

    Fred

  10. #10
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Il faut toujours généraliser au maximum pour faciliter la maintenance. Aujourd'hui tu as besoin de 3 ou 4 balises mais quand il va falloir en rajouter tu vas faire quoi ? à chaque fois tu vas te replonger dans le code pour ajouter des fonctionnalités ?

    La mécanique que je t'ai fournie utilise un tableau associatif pour connaitre les balises à remplacer et par quoi les remplacer. Par exemple 'a' => 'em' signifie qu'on rempalce [a] [/a] par <em> </em>.
    Seulement, on ne peut pas l'utiliser tel quel, c'est pour ça que je fais parcourir les clés et les valeurs du tableau de traduction pour fabriquer les éléments de remplacement qui seront in fine utilisé par la fonction preg_replace.
    A terme, tu pourra mettre ce tableau de traduction dans un fichier ini par exemple et tu pourra ajouter de nouvelles balises sans toucher au code.

  11. #11
    Membre régulier
    Avatar de sourcilpower
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2011
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2011
    Messages : 128
    Points : 124
    Points
    124
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par micetf Voir le message
    Alors pour commencer, peut-être que ceci fera l'affaire ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $texte = "Je suis un gros [lol][bb]nul[/bb], et pourtant j'ai [ii]tout appris[/ii][/lol][mdr] les [bb]banane[/bb] que c'est bon les [ii]banane[/ii] j'adore[/mdr].";
     
    // Je remplace les balises bb comprises entre des balises lol
    $texte = preg_replace('#(\[lol\].*)\[bb\](.*?)\[/bb\](.*\[/lol\])#', '$1<strong>$2</strong>$3', $texte);
    // Je remplace les balises ii comprises entre des balises lol et je supprime les balises lol
    $texte = preg_replace('#\[lol\](.*)\[ii\](.*?)\[/ii\](.*)\[/lol\]#', '$1<em>$2</em>$3', $texte);
     
    // Je remplace les balises bb comprises entre des balises mdr
    $texte = preg_replace('#(\[mdr\].*)\[bb\](.*?)\[/bb\](.*\[/mdr\])#', '$1<strong>$2</strong>$3', $texte);
    // Je remplace les balises ii comprises entre des balises mdr et je supprime les balises mdr
    $texte = preg_replace('#\[mdr\](.*)\[ii\](.*?)\[/ii\](.*)\[/mdr\]#', '$1<em>$2</em>$3', $texte);
    echo $texte;
    Mais, pour généraliser, il me semble pas inutile de se pencher sur la proposition de Benjamin.

    Fred
    merci pour ta reponse c'est ce que je voulais
    N'oublie pas le pouce vert

  12. #12
    Membre éclairé Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Points : 831
    Points
    831
    Par défaut
    Il faut toujours généraliser au maximum pour faciliter la maintenance
    Tout à fait d'accord, alors...
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    $bb_tags = array(
    	'lol' => array (
    		'bb' => 'strong',
    		'ii' => 'em'
    	),
    	'mdr' => array (
    		'bb' => 'em',
    		'ii' => 'strong'
    	)
    );
     
    $bb_patterns=array();
    $bb_replace=array();
    foreach ($bb_tags as $code => $balises) {
    	foreach ($balises as $tag => $balise) {
    		$bb_patterns[]="#(\[$code\].*)\[$tag\](.*?)\[/$tag\](.*\[/$code\])#";
    		$bb_replace[]="$1<$balise>$2</$balise>$3";
    	}
    	$bb_patterns[]="#\[$code\](.*?)\[/$code\]#";
    	$bb_replace[]="$1";
    }
     
    $texte = "Je suis un gros [lol][bb]nul[/bb], et pourtant j'ai [ii]tout appris[/ii][/lol][mdr] les [bb]banane[/bb] que c'est bon les [ii]banane[/ii] j'adore[/mdr].";
    $texte = preg_replace($bb_patterns, $bb_replace, $texte);
    echo $texte;
    Fred

  13. #13
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Note que ma solution n'utilise pas de structures de boucles

  14. #14
    Membre éclairé Avatar de micetf
    Homme Profil pro
    Professeur des Ecoles
    Inscrit en
    Mai 2009
    Messages
    557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ardèche (Rhône Alpes)

    Informations professionnelles :
    Activité : Professeur des Ecoles
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2009
    Messages : 557
    Points : 831
    Points
    831
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Note que ma solution n'utilise pas de structures de boucles
    Effectivement...
    mais elle ne répond pas à la question de sourcilpower.
    En effet, tu ne gères pas la différence de traduction des balises selon que le code se trouve entre des balises [lol] ou [mdr]. Ce que je me suis attaché à faire.

    Ce qui n'empêche pas qu'il existe certainement une solution élégante à base de array_map pour supprimer les structures de boucles...

    Fred

  15. #15
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Effectivement, je me suis attaché à la transcription des balises, je ne prévois pas de comportement dissocié selon le contexte de la balise bb parente à une balise donnée.

    Remarque, je me demande bien à quoi ça peut servir de faire de cette manière...
    En BB code, l'élément suivant
    helloworld
    est traduit par
    <strong><i>hello</i>world</strong>
    Je vois mal comment on peut avoir besoin d'autre chose...

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

Discussions similaires

  1. Regex : remplacer une regex par une variable
    Par Julipp dans le forum Général Python
    Réponses: 5
    Dernier message: 07/04/2013, 15h03
  2. Décrypter RIJNDAEL_128 par block
    Par cid007300 dans le forum Langage
    Réponses: 1
    Dernier message: 20/02/2013, 17h43
  3. [RegEx] supprimer <a href...</a> par regex dans pages html.
    Par moldak dans le forum Langage
    Réponses: 10
    Dernier message: 15/11/2012, 16h02
  4. [SP-2010] Affichage des colonnes par block
    Par bdptaki dans le forum SharePoint
    Réponses: 3
    Dernier message: 24/10/2011, 15h47
  5. regex par block
    Par sourcilpower dans le forum Langage
    Réponses: 30
    Dernier message: 01/03/2011, 23h51

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