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 :

Résumé d'une chaine formatée (balise tronquée) [RegEx]


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Résumé d'une chaine formatée (balise tronquée)
    Bonjour,
    Pour mon système de News, j'ai du texte formaté (avec balises html)
    Je fais un RESUME du texte (les 60 1ers caractères, par exemple) :

    Or, le texte étant formaté, une balise html peut se trouver tronquée, et/ou d'autres non fermées ! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    $texte = 'qsdf <u>qfqsdfqsdf <strong>sfqdsdffsdt wqqsdfsdf qsdfqs</strong> qsdqsd qsdqqsd fdsfqsdf fqsdf qsdfq qsdf</u> qsdf sdfqsdfqsdfqsdf.';
    $resume = substr($texte,0,59);
    // on obtient -->
    $resume = 'qsdf <u>qfqsdfqsdf <strong>sfqdsdffsdt wqqsdfsdf qsdfqs</str';
    ?>
    De ce fait, la suite de la page est toute chamboulée !

    Comment m'y prendre pour :
    1- fermer une balise tronquée
    ---> si c'est une balise "ouvrante : la supprimer
    ---> si c'est une balise fermante : la fermer (et la compléter : </str --> </strong>
    2- trouver les balises non fermées ? Et donc les fermer.

    Possible ? / Pas possible ? / Trop compliqué ? / ...

    Note : je sais que la solution la plus simple serait d'enlever toutes les balises html, mais bon ...
      0  0

  2. #2
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Comment m'y prendre pour :
    1- fermer une balise tronquée
    ---> si c'est une balise "ouvrante : la supprimer
    ---> si c'est une balise fermante : la fermer (et la compléter : </str --> </strong>
    Bonsoir,
    Pas chez moi, donc pas d'environnement de test, mais à main levée je commencerais par un truc dans ce genre, à affiner s'il ne marche pas tout à fait.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str = preg_replace('#</?[^>]*$#', '', $str);
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U
      0  0

  3. #3
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    2- trouver les balises non fermées ? Et donc les fermer.

    Possible ? / Pas possible ? / Trop compliqué ? / ...
    Je pense que c'est possible.
    Mais je pense aussi que ce n'est pas simple. Tout dépend de ce que tu entends par TROP compliqué...

    Quoi qu'il en soit, cette partie nécessite un environnement de test, je ne peux te répondre sur la vieille bécane de mes parents.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U
      0  0

  4. #4
    Invité
    Invité(e)
    Par défaut
    Comme c'est pour un tuto, je suis prêt à relever le défi !
    Et si ca n'existe pas encore, j'en ferai une "fonction" ...
    J'ai une 1ère piste ici :
    http://php.developpez.com/faq/?page=...es_parsebbcode

    Compliqué, non.
    Complexe : sans doute
    Réalisable ? Oui, en retroussant ses manches !
      0  0

  5. #5
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Trouver ce genre de balise ouverte sera du gâteau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $str = "<p>Un paragraphe</p><p>autre paragraphe tronqué";
    Mais là où ça va se corser, c'est dans ce genre de situations :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $str = "<p>un paragraphe <b>avec du gras</b> et troncature";
     
    $str = "<div id='wrapmain'><p>Paragraphe</p><p>autre paragraphe <b>avec du gras tronqué";
    Etc...

    Le problème étant connu, identifié, et résolu dans la plupart des cas : identifier les paires de balises.
    Mais c'est toujours un peu de noeuds au cerveau en prévisions...

    A vue de nez, je pense que l'exemple #3 de la page suivante pourra être utile à la réflexion : http://fr3.php.net/manual/fr/functio...e-callback.php
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U
      0  0

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par s.n.a.f.u Voir le message
    Le problème étant connu, identifié, et résolu dans la plupart des cas : identifier les paires de balises.
    Mais c'est toujours un peu de noeuds au cerveau en prévisions...
    Oui tout à fait !

    En fait, le principe consiste à vérifier un bout de code html, et tester si les balises sont fermées ou non !
      0  0

  7. #7
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Un souci de BBcode auquel j'avais participé, si ça peut aider.

    http://www.developpez.net/forums/d66...back-recursif/
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U
      0  0

  8. #8
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par s.n.a.f.u Voir le message
    Un souci de BBcode auquel j'avais participé, si ça peut aider.
    Merci pour ton aide.
    Je vais voir ca de plus près ... Je te ferai part ici de mon "avancement" ...
      0  0

  9. #9
    FoxLeRenard
    Invité(e)
    Par défaut
    Bonjour vous deux

    Désolé, mais c'est presque mission impossible, car si nous raisonnons en terme
    de morceau de html, servant a faire une "ACROCHE" genre lire la suite ...

    Il faut comprendre que la mise en forme devrait en toute logique n'étre plus qu'un texte d'acroche que l'on peut agrémenter d'une couleur unique qui le différencie.

    En effet comment allez vous mémoriser les éléments lointains
    TABLE TR TD DIV Etc... alors que se dire je vire toutes les balises c'est simple !

    Bon Dimanche a vosu
      0  0

  10. #10
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Citation Envoyé par FoxLeRenard Voir le message
    Bonjour vous deux

    Désolé, mais c'est presque mission impossible, car si nous raisonnons en terme
    de morceau de html, servant a faire une "ACROCHE" genre lire la suite ...

    Il faut comprendre que la mise en forme devrait en toute logique n'étre plus qu'un texte d'acroche que l'on peut agrémenter d'une couleur unique qui le différencie.

    En effet comment allez vous mémoriser les éléments lointains
    TABLE TR TD DIV Etc... alors que se dire je vire toutes les balises c'est simple !

    Bon Dimanche a vosu
    Désolé aussi, mais je me dois de ne pas être tout à fait daccord.
    C'est tout à fait possible d'un point de vue technique.
    Au niveau fonctionnel, il y a effectivement une réflexion à avoir sur la mise en forme finale, mais il n'y aura quand même pas besoin de Tom Cruise ou de M. Phelps.
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U
      0  0

  11. #11
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Je fait de même

    Je pense que c'est tout de même possible, mais très complexe à mettre en œuvre, le jeu n'en vaut sans doute pas la chandelle.

    Il faut je pense établir des règles de bases, genre ne pas tronquer au milieu d'un a, virer le contenu des balises complexes comme les tableaux, listes, etc..

    Sinon, le plus simple reste sans doute de faire toi même lors de la rédaction, l'extrait à afficher, comme dans dotclear par exemple.
      0  0

  12. #12
    FoxLeRenard
    Invité(e)
    Par défaut
    Citation Envoyé par Xunil Voir le message
    Sinon, le plus simple reste sans doute de faire toi même lors de la rédaction, l'extrait à afficher, comme dans dotclear par exemple.
    Oui j'avais parlé d'acroche, car les grands généarteurs comme SPIP te demandent carément ton acroche !

    Pour ma part c' est se que je fais sur certains sites
      0  0

  13. #13
    Invité
    Invité(e)
    Par défaut
    Bonjour à tous,
    et merci de participer à cette discussion !
    Il semble que j'ai "levé un gros lièvre" avec ma question !

    Pour info, tout est parti de là :
    "système de gestion de News (avec photo)"
    http://www.developpez.net/forums/d73...uvelles-photo/
    J'ai ajouté un éditeur wysiwyg (en fait, 2 au choix), après une demande d'un forumeur.
    Et c'est en faisant les tests que je me suis rendu compte du problème.
    (la page news_liste.php affiche la liste des news, avec un RESUME du contenu "formaté")

    C'est en effet un "gros dossier" !
    Et qui pourrait nous amener à réaliser une fonction, certes complexe, mais faisable.
    A mon avis, il faut commencer "petit" :
    1- des simples balises ouvrante/fermante),
    2- avant d'attaquer des histoires de <table><tr><td> ... (qui vont corser encore plus le problème)

    Perso, je ne suis pas très fort en regex , mais en s'y mettant à plusieurs ...
    Il faut donc reformer l'équipe de "Mission (Presque) Impossible" !
    Attention : ce message ne s'autodétruira pas dans les 5 secondes ...
      0  0

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

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    est-ce qu'il y a quand même des balises que tu veux supprimer ?
    D'autre part, étant donné que ça risque d'être une fonction assez lourde, je me demande si tu n'auras pas intérêt à stocker le résumé en BDD et ne le recréer qu'à la modification d'une news.

    Personnellement je ferais déjà une fonction substr() maison pour ne pas tronquer une balise de fin en plein milieu.
    Ensuite tu pourrais faire par exemple un remplacement par paires des balises que tu veux garder (avec un caractère spécial, ex : { }), ex :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $texte = 'qsdf <u>qfqs<div>dfqs</div>df <strong>sfqdsdffsdt wqqsdfsdf qsdfqs</strong> qsdqsd qsd<p>qqsd <font>fdsfqs</font>df fq</p>sdf qsdfq qsdf</u> qsdf sdfqsd <p>fqsdfqsdf reterterte er ertert erterteeeretet </p>.';
    => troncature

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $resume = 'qsdf <u>qfqs<div>dfqs</div>df <strong>sfqdsdffsdt wqqsdfsdf qsdfqs</strong> qsdqsd qsd<p>qqsd <font>fdsfqs</font>df fq</p>sdf qsdfq qsdf</u> qsdf sdfqsd <p>fqsdfqsdf.';
    => remplacements

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $resume = 'qsdf {u}qfqs<div>dfqs</div>df {strong}sfqdsdffsdt wqqsdfsdf qsdfqs{/strong} qsdqsd qsd{p}qqsd <font>fdsfqs</font>df fq{/p}sdf qsdfq qsdf{/u} qsdf sdfqsd <p>fqs<strong>dfqsdf.';
    = > puis un strip_tags() pour virer les div, table, etc et balises non fermées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $resume = 'qsdf {u}qfqsdfqsdf {strong}sfqdsdffsdt wqqsdfsdf qsdfqs{/strong} qsdqsd qsd{p}qqsd fdsfqsdf fq{/p}sdf qsdfq qsdf{/u} qsdf sdfqsd fqsdfqsdf.';
    => et re-remplacement des balises :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $resume = 'qsdf <u>qfqsdfqsdf <strong>sfqdsdffsdt wqqsdfsdf qsdfqs</strong> qsdqsd qsd<p>qqsd fdsfqsdf fq</p>sdf qsdfq qsdf</u> qsdf sdfqsd fqsdfqsdf.';
    C'est peut-être une idée...
    Vive les roues en pierre
      0  0

  15. #15
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par FoxLeRenard Voir le message
    je vire toutes les balises c'est simple !
    C'est ce que je faire faire dans un 1er temps (pour rendre mon système de News opérationnel tout de suite)
    Avec : $chaine = strip_tags($chaine);

    Bonjour Djakisback et bienvenu dans cette discussion !
    En fait, je n'en ai pas "besoin", mais ça me semble être un problème fort intéressant à résoudre !
    Et surtout bien plus "général" que pour mon petit système de news.
      0  0

  16. #16
    Membre expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Points : 3 545
    Points
    3 545
    Par défaut
    Tout à la joie d'avoir une bonne grosse regex de la mort en perspective, j'en ai oublié la finalité...
    => Ne serait-il pas plus judicieux d'utiliser Tidy ? http://www.php.net/manual/fr/tidy.repairstring.php
    • Avant de poser une question, n'hésitez pas à chercher dans la FAQ et les forums
    • Merci d'utiliser les balises de code (# dans l'éditeur)
    • N'oubliez pas de vous servir des boutons , et

    S.N.A.F.U
      0  0

  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par s.n.a.f.u Voir le message
    Tout à la joie d'avoir une bonne grosse regex de la mort en perspective, j'en ai oublié la finalité...
    => Ne serait-il pas plus judicieux d'utiliser Tidy ? http://www.php.net/manual/fr/tidy.repairstring.php
    Bonjour s.n.a.f.u,
    Je me doutais bien que quelqu'un y avait pensé avant nous ! Ils sont forts, chez PHP !
    Flute ! Ce n'est pas encore ce coup-ci qu'on décrochera le Prix Nobel !!

    Je vais tester ca dès que possible (mon tuto doit être accessible aux débutants).
    En tout cas, pour les regex de-la-mort-qui-tue, je saurais à qui m'adresser !
      0  0

  18. #18
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Ah, mais c'est cool cette biblliothèque, je connaissais de nom, mais je ne m'étais jamais trop penché dessus.

    Et je viens de penser à un truc, c'est que ça va peut-être pouvoir rendre mes documents transformés via xsltproc (qui déconne avec les tags uniques) valide.

    Je vais tester pour voir ce que ça donne.
      0  0

  19. #19
    Invité
    Invité(e)
    Par défaut
    Finalement :
    une question "toute bête" peut amener une réponse "TRES intelligente" !!!
      0  0

  20. #20
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Oui, j'ai bien fait de poster par ici

    Bon, après avoir recompiler php, j'ai fait des tests mais ça merdouille.

    Les styles définis dans les tags html sont carrément supprimés.
    Par contre les balises uniques ont bien été fermées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo tidy_repair_string($html, array('output-xhtml'=>true, 'doctype'=>'strict', 'indent'=>true));
      0  0

Discussion fermée
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. ecrire à un endroit précis une chaine formatée
    Par bobyboby dans le forum Bibliothèque standard
    Réponses: 20
    Dernier message: 31/10/2008, 15h53
  2. [sscanf] Lire une chaine formatée contenant des []
    Par gangsoleil dans le forum Bibliothèque standard
    Réponses: 3
    Dernier message: 11/09/2008, 09h09
  3. Fonction pour charger une chaine formaté
    Par dxdiag dans le forum Débuter
    Réponses: 5
    Dernier message: 08/02/2008, 21h35
  4. Convertir une chaine en format heure
    Par Lars dans le forum ASP
    Réponses: 3
    Dernier message: 24/05/2005, 11h44
  5. [langage] cherche script pour formater une chaine
    Par MASSAKA dans le forum Langage
    Réponses: 7
    Dernier message: 12/11/2003, 12h18

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