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

PHP & Base de données Discussion :

PHP : PCRE - preg <pre> in <pre>


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Avatar de LAB3W
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2022
    Messages : 26
    Points : 56
    Points
    56
    Par défaut PHP : PCRE - preg <pre> in <pre>
    Bonjour,

    J'essaie de faire un script sur une chaine de caractères.

    Pour l'instant j'ai fais cela :

    Page de test : https://www.zw3b.net/links-contents.php

    Dans la fonction "parse", mon expression régulière n'est pas bonne.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <?php
     
    function parse($text)
    {
    	$regex_pre = "#<((pre|PRE))>(.*?)<\/\\1>#s";
    	$regex_code = "#<((code|code))>(.*?)<\/\\1>#s";
     
    	$text = preg_replace_callback($regex_pre, 'parse_preFormated', $text, -1 , $count);
    	$text = preg_replace_callback($regex_code, 'parse_codeFormated', $text, -1 , $count);
     
    	return $text;
    }
     
    function parse_preFormated($value) {
     
    	//echo '<pre>'.print_r($value,1).'</pre>';
     
    	$script_temp = $value[3];
    	$script_temp = utf8_encode($script_temp);
     
    	$script = htmlentities($script_temp, ENT_QUOTES | ENT_SUBSTITUTE | ENT_XHTML, null, false);
     
    	//$script = str_replace(array('/', '\\'), array('/', '\'), $script);
    	$script = str_replace(array('/', '\\', '\'', '@'), array('\&sol;', '\\', '\&apos;', '\@'), $script);
     
    	$script = '<pre class="code">'.$script.'</pre>';
     
    	return $script;
    }
     
    function parse_codeFormated($value) {
     
    	//echo '<pre>'.print_r($value,1).'</pre>';
     
    	$script_temp = $value[3];
    	$script_temp = utf8_encode($script_temp);
     
    	$script = htmlentities($script_temp, ENT_QUOTES | ENT_SUBSTITUTE | ENT_XHTML, null, false);
     
    	$script = str_replace(array('/', '\\', '\'', '@'), array('\&sol;', '\\', '\&apos;', '\@'), $script);
     
    	$script = '<code class="code">'.$script.'</code>';
     
    	return $script;
    }
     
    #................
    Si dans le champ $text j'ajoute un "<pre>mon_code</pre>" l'expression régulière de "parse" s'arrête à la premiere balise de fermeture </pre>


    Mon champ texte est celui-ci avec le code complet :

    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
    #................
     
    $text = '<p>mon texte de début</p>'."\n\n";
     
    $text.= '<pre>'."\n\n";
    $text.= '<?php'."\n\n";
    $text.= '# Pour afficher un tableau PHP'."\n\n";
     
    $text.= '$var[\'website\'] = 'domain.tld';'."\n";
    $text.= '$var[\'weblink\'] = 'http://www.domain.tld';'."\n\n";
     
    $text.= '# BUG ICI'."\n";
    $text = 'echo <pre>\'.print_r($var,1).\'</pre>'."\n\n";
     
    $text = 'echo 'My domain : '.$var[\'website\']."\n\n";
    
    $text = '?>'."\n";
    $text.= '</pre>'."\n\n";
     
    $text.= '<p>mon texte de fin.</p>'."\n\n";
     
    #................
    J'appelle comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #................
     
    echo parse($text);
     
    ?>
    Quelqu'un sait ? Qui a une solution ?

    Merci à vous.

    Romain

    J'ai fais une API si vous voulez plus en voir ZW3B API Client v7.1.2 http://api.zw3b.fr/ - http://howto.zw3b.fr/developpement/php/zw3b-api-client
    PCRE : https://www.php.net/manual/fr/refere...ern.syntax.php

    Initiation aux expressions régulières en PHP de Guillaume Rossolini : https://g-rossolini.developpez.com/tutoriels/php/regex/
    Rien à voir mais peut sûrement vous interessez :
    1. J'ai écris un code PHP de "Visualisation HTML de vos rapports DMARC (rapport de conformité des serveurs mail destinataires de vos couriels)" -> PHPSource à installer sur votre serveur (enlevez le "s" de "php" pour avoir le rendu) - plus d'info ici
    2. Et des mini-scripts ".bash" (commentaire 32) pour dezipper facilement les fichiers "dmarc.zip" selon l'envie cf : contributor PengouinPdt.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 376
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 376
    Points : 15 728
    Points
    15 728
    Par défaut
    si vous essayez d'analyser du code php, une expression régulière ne suffira peut-être pas.
    est ce qu'il y a juste quelques cas particuliers avec du code php ou ça peut être présent de façon générale ?

  3. #3
    Membre du Club
    Avatar de LAB3W
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2022
    Messages : 26
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    Citation Envoyé par mathieu Voir le message
    si vous essayez d'analyser du code php, une expression régulière ne suffira peut-être pas.
    Logiquement çà doit suffire ! Peut-être avec une condition ou 2

    Citation Envoyé par mathieu Voir le message
    est ce qu'il y a juste quelques cas particuliers avec du code php ou ça peut être présent de façon générale ?
    C'est de façon générale

    Je vais cherché en sélectionnant le "pre" balise ouvrante jusqu'à la 1ere balise "pre" fermante.

    Si j'y arrive je reviens vers vous - le forum
    Si je n'y arrive pas - aussi

    Bonne journée.

    Citation Envoyé par LAB3W
    14h34 : Je vais cherché en sélectionnant le "pre" balise ouvrante jusqu'à la 1ere balise "pre" fermante.
    En fait c'est ce que çà fait déjà

    En changeant l'expression de cette manière : $regex_pre = "#<(pre|PRE)>(.*?)<(\/\\1)>#sm"; le (array)output change mais ce n'est pas bon.

    Il faudrait que je déclare :

    1. Si je trouve une balise <pre>du texte</pre> -> Okay
    2. Si je trouve une balise <pre>du texte encore un <pre>un autre texte</pre> texte ou non</pre> - que je compte le nombre de <pre> ouvrant pour attraper le bon </pre> fermant


    Une expression style comme cela - en utilisant les sous-masques conditionnels ¶ de #PHP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $regex_pre = "#<((pre))>(?(?=(.*?)|[^<pre>](.*?)[<\/pre>])(.*?))<(\/\\1)>#ism";
    Et là c'est autre chose Mais çà n'doit pas être si compliqué

    Merci

  4. #4
    Membre du Club
    Avatar de LAB3W
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2022
    Messages : 26
    Points : 56
    Points
    56
    Par défaut
    Mesdames, messieurs,

    J'ai toujours les soucis des doubles tag html..
    J'ai écris une petite classe PHP - une API en RESTful que vous pouvez récupérer (elle permet entre autre de récupérer les listes des contenus de mes sites Web (les listes sont ouvertes) et le contenu entier des documentations (par authentification en beta-testeurs et depuis n'importe quelle origine de sites web) :

    Le lien direct de mon fichier zw3bApiClient.class.phps : Il y a une classe "tools" avec une méthode public "link_replace_callback(string)" qui permet de parser les liens.

    /***********
    * Methode link_replace_callback(string)
    *
    * Links parse/create :
    *
    * - http(s)://www.domain.tld/link
    * - ftp(s)://ftp.domain.tld
    * - ftp(s).domain.tld
    * - www.domain.tld
    * - <a href="(http|ftp)(s)://url.domain.tld/link">link</a> except the anchors
    * - couriel@domain.tld
    * - #hastags
    *
    * Checks HTML <pre> and <code> tags and does not parse links
    *
    * - Encode in htmlentities, more, more
    *
    * ex : https://www.zw3b.net/links-contents.php
    *
    ****/

    Si cela vous intéresse J'en suis sûr

    Je vous ai fais un fichier d'exemple pour que vous compreniez comment fonctionne l'API pour récupérer les documentations ZW3B -> doc informatiques GNU/Linux pour la plupart

    Informations ici : ZW3B API Client v7.1.2

    Salutations,
    Romain (LAB3W O.Romain.Jaillet-ramey)

    Créateur de ZW3B.FR | TV | SITE | NET | BLOG

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 894
    Points : 6 645
    Points
    6 645
    Par défaut
    Citation Envoyé par LAB3W Voir le message
    Logiquement çà doit suffire ! Peut-être avec une condition ou 2
    ...
    Mais çà n'doit pas être si compliqué
    Si, ça l'est!

    Avant quoi que ce soit: qu'est ce qui te permet d'affirmer dans le code ci-dessous, que la balise fermante </pre> se trouve ligne 18 et pas ligne 13 ?

    Code html : 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
    <p>mon texte de début</p>
     
    <pre>
     
    <?php
     
    # Pour afficher un tableau PHP
     
    $var['website'] = 'domain.tld';
    $var['weblink'] = 'http://www.domain.tld';
     
    # BUG ICI
    echo '<pre>'.print_r($var,1).'</pre>'
     
    echo 'My domain : '.$var['website']
     
    ?>
    </pre>
     
    <p>mon texte de fin.</p>

    Je te demande ça parce qu'il est clair que pour un navigateur ou la plupart des parsers html, la balise fermante se trouve ligne 13! D'ailleurs regarde ce que devient ce code si on le passe à libxml:
    Code html : 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
    <p>mon texte de début</p>
     
    <pre>
     
    <?php # Pour afficher un tableau PHP
     
    $var['website'] = 'domain.tld';
    $var['weblink'] = 'http://www.domain.tld';
     
    # BUG ICI
    echo '<pre>'.print_r($var,1).'</pre>'
     
    echo 'My domain : '.$var['website']
     
    ?&gt;
     
     
    <p>mon texte de fin.</p>
    Il a viré la balise orpheline de la ligne 18.

    Le problème c'est que si à l'ouverture d'une balise <pre> tu veux "changer de logique" et te plier à la syntaxe d'un autre langage, il faut que ce langage soit clairement identifié:
    • est-ce que c'est toujours du PHP ?
    • y-a-t-il toujours <?php au début ?
    • comment faire si ça peut être n'importe quel langage ?


    Peut-être faut-il prendre les choses en amont, comment est généré ce code? D'où provient-il?

    Rien qu'en PHP, il y a 4 syntaxes de chaînes: simple quotes, double quotes, heredoc, nowdoc.

  6. #6
    Membre du Club
    Avatar de LAB3W
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2022
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2022
    Messages : 26
    Points : 56
    Points
    56
    Par défaut
    Bonjour, merci pour ta réponse @CosmoKnacki

    Citation Envoyé par CosmoKnacki Voir le message
    Si, ça l'est!

    Avant quoi que ce soit: ......
    C'est bon les expressions régulières.. oui ce n'est pas tout simple.

    C'est un texte d'exemple : Essaie par ici https://www.zw3b.net/links-contents.php : Je me suis fais un formulaire pour tester mes "preg"

    La/les class PHP sont ici dans ce fichier zw3bApiClient PHP Source que j'ai écrite - dans la class "zw3bTools()" en l'occurrence - que vous pouvez récupérer/transformer/vendre (haha) et utiliser sans modération

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $text = "bla bla... <pre>$var[] = "text"; echo 'du code pour tester...';</pre>... etc...."
     
    echo $tools->link_replace_callback($text);
     
    $other_text = "bla bla... <pre>$var[] = "text"; echo '<pre>var_dump(var);</pre>'; </pre>... etc...."
     
    echo $tools->link_replace_callback($other_text );
    J'écris souvent des documentations informatique... et donc dans une balise "pre" (d'explicatiion de code) çà m'arrive de devoir expliquer au lecteur quelque chose en lui montrant la sortie de avec un "echo '<pre>'.print_r($array,1).'<pre>';" pour qu'il puisse copier/coller l'explication et essayer le code et voir le rendu du "print_r") mais çà casse le code, chose normal puisque dans mon "ereg" je lui dis de récupérer la "premiere" balise fermante "/pre" dès qu'il en trouve une ouvrante.

    Certes je pourais lui mettre un var_dump() ou un print_r() hors echo mais bon.. c'était histoire de demander un truc sur preg_*

    "#<(pre)>(.*?)<(\/pre)>#sm";

    Ce serait pareil pour une balise <strong> ou autre... mais on ne ferait pas attention... (sauf le validateur W3C me signalerai qu'il manque une balise fermante).

    Je te laisse tester sur le "formulaire"... pour que tu comprennes mieux : https://www.zw3b.net/links-contents.php

    Tu peut essayer ce PHP Source : http://api.zw3b.fr/api-client-contents-docs.phps aussi qui sont toutes les docs que j'ai écris - En copiant/collant ce fichier sur ton serveur PHP (en enlevant le "s" de .php) te donnera exactement ce rendu http://api.zw3b.fr/api-client-contents-docs.php

    Merci !

    NdMoi-même : par exemple sur "cette doc" -> http://howto.zw3b.fr/developpement/php/zw3b-api-client (ou avec mon nouveau "preg" via l'API Cliente ) j'aimerais bien afficher une balise <pre></pre> dans mon explication entouré d'une balise "pre"

    PS RienÀVoir : Mes certif SSL (www) expire today ^^ j'ai de l'admin à faire aujourd'hui Gandi -> Let's Encrypt :/

    Okay

    Bonne journée à vous.

    Salutations,
    Romain

Discussions similaires

  1. [EDI] Quel est l'éditeur que vous recommandez pour PHP ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 400
    Dernier message: 10/04/2018, 20h08
  2. Quel est le meilleur script PHP de portail (CMS) ?
    Par Lana.Bauer dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 187
    Dernier message: 18/10/2012, 07h45
  3. [MySQL] Relation père-fils en PHP et MySQL
    Par nabians dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 18/07/2007, 11h02

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