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 :

[BBCode] preg_replace_callback récursif


Sujet :

Langage PHP

  1. #21
    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
    LOL, le ++ ne peut pas être changé en +++

    C'est une notion un peu avancée des regex que je donne assez rarement car elle n'est pas souvent nécessaire.

    Et je donne toujours les mêmes liens pour les expliquer :

    http://www.regular-expressions.info/possessive.html
    http://www.regular-expressions.info/atomic.html

    Bonne chance !

    PS : peut-être peux-tu augmenter la taille mémoire attribuée à 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

  2. #22
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    J'ai continué les tests...

    Sur mon ancien portable sous XP PHP 5.2.5 : la fonction non optimisée par ta dernière modification passe 49.989 caractères

    Sur mon nouveau portable sous Vista Home PHP 5.2.9 : je passe 390 (et avec l'optimisation 780)


    Pour m'assurer que c'est l'OS ou PHP j'installe PHP 5.2.5 sur le serveur wamp c'est facile de switcher et verdicte : 49.993 caractères


    Quand ça fonctionne et si je dépasse la limite, apache ne plante pas mais la chaine retournée est vide.


    Le php.ini est identique tout comme apache donc il s'agit bien d'un bug PHP 5.2.9

    La solution est donc de rester en 5.2.5 en attendant.


    Merci pour ton aide

  3. #23
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    Bonjour,

    J'ai actuellement le même problème, je suis bloqué au dela d'un certain nombre de caractères avec mon preg_replace_callback... Et j'ai des pages de plus de 100 000 caractères...

    Y a-t-il moyen de passer outre cette limitation de 49000 caractères ?

    Pour la taille en mémoire, dans le php.ini je suis passé de 8M à 512M, sans effet notable...
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

  4. #24
    Membre régulier
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2005
    Messages : 152
    Points : 80
    Points
    80
    Par défaut
    Salut,

    Désolé je n'ai pas de solution pour le moment. Il faut dire que les 50k me suffisent.


    Je vois 2 pistes de solutions que n'en sont pas vraiment

    1/ découpage intelligent
    2/ réduction intelligente


    1/ Le découpage intelligent consisterait à couper la chaine en morceau de < de 50k. Intelligent signifiant que le découpage n'altere en rien le résultat

    Exemple :

    <bbc>30k</bbc><bbc>30k</bbc><bbc>30k</bbc><bbc>30k</bbc>

    30k : 30.000 caractères

    Serait découpé en 4 morceaux et donc 4 appels à preg_replace_callback mais le problème est le suivant

    <bbc>570k</bbc>


    2/ la réduction intelligente : on réduit la taille des chaines non significatives

    <bbc>30k</bbc><bbc>30k</bbc><bbc>30k</bbc><bbc>30k</bbc>

    Donnerait

    <bbc>$ref1</bbc><bbc>$ref2</bbc><bbc>$ref3</bbc><bbc>$ref4</bbc>

    $refx est une variable qui contient le contenu et sur lequel on peut effectuer un traitement.


    Mais tout cela est du rafistolage qui risque de réduire fortement les performances.


    a/ Il faut s'interoger sur la pertinence d'utiliser preg_replace_callback sur une chaine de 100k dans une application web


    Dans mon site lors de l'affichage d'une page, il se pourrait qu'on appel des dizaines de fois preg_replace_callback. Et je devrai surveiller les performances voir faire de la mise en cache.

    b/ Eventuellement externaliser ce traitement (via java ou c++)

    c/ Contacter les dev de PHP pour avoir leur avis


    Mais je pense que la réduction intelligente est une bonne piste dans ton cas


    -> En fonction du regex, remplacer les chaines non significatives par des références.

  5. #25
    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 Rakken Voir le message
    Bonjour,

    J'ai actuellement le même problème, je suis bloqué au dela d'un certain nombre de caractères avec mon preg_replace_callback... Et j'ai des pages de plus de 100 000 caractères...

    Y a-t-il moyen de passer outre cette limitation de 49000 caractères ?

    Pour la taille en mémoire, dans le php.ini je suis passé de 8M à 512M, sans effet notable...
    Parser du BBCode sur 100 000 caractères ?!
    Il me semblait que le BBCode n'était utilisé que dans les forums, donc sur des textes beaucoup plus courts.
    Pourrais-tu décrire succinctement le contenu de ces chaînes ?
    • 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

  6. #26
    Membre expérimenté
    Avatar de Rakken
    Homme Profil pro
    Inscrit en
    Août 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 257
    Points : 1 341
    Points
    1 341
    Par défaut
    En fait, pour mes sites, j'ai créé un CMS. L'idée est qu'une fois posé (modulo les css et les éventuels ajouts de modules) je puisse construire mes sites sans plus toucher au code.
    Pour ca, quand je passe en mode admin, chaque page est entièrement éditable façon wiki. Donc l'équivalent bbcode ne se trouve pas au niveau d'un post, mais d'une page complete. Et il se trouve que dans la mesure ou c'est un site qui décrit un monde imaginaire, il y a beaucoup de contenu textuel.
    La pire de mes pages (ou pas loin : le culte des ténèbres).
    Bref, les 100 000 caractères sont sommes toute assez vite atteint, surtout quand on considère que je pose automatiquement une infobulle sur chaque mot qui a un sens particulier dans le monde (Oneira, Thard, etc...).
    Le code source généré de cette page fait plus d'un million de caractère, alors une limite a 30 000...
    Bon, clairement, cette page est un cas extrème, et elle sera découpée en plusieurs section, ne serait-ce que pour le temps de chargement, mais c'est représentatif de mon problème.

    Pour ce qui est du temps de traitement, j'ai mis en place un système de cache qui fait qu'au premier affichage de la page, celle-ci est calculée (ça prend rarement plus de quelques secondes, sauf sur cinq ou six pages particulièrement complexes, comme le glossaire ou la chronologie), et ensuite, le résultat est directement stocké en base, donc l'affichage suivant est quasi instantané.

    Pour un exemple de bbcode que je parse, voici le début de la page donné en lien :
    [titre1]Le culte des Ténèbres[/titre1]
    [ligne]
    [lettrine|L]e [l]culte des Ténèbres[/l] est essentiellement honoré en [l]Ar'Thard[/l] et en [l]Ar'Boeren[/l]. [l]Culte des ténèbres[/l] absolues, ses [l]prêtres[/l] vivent dans le noir, afin de mieux percevoir l'essence vraie des choses.
    [halo]Le [l]culte des Ténèbres[/l] considère que le monde est illusion et que tout être vivant est constamment trompé par ses sens. Le but du [l]culte des Ténèbres[/l] est donc de percevoir la véritable essence d'[l]Oneira[/l] en se détachant des sens "usuels", et plus particulièrement la vue. En effet, ceux qui regardent [l]Oneira[/l] avec leur yeux ne peuvent se détacher de ce qu'ils voient et ce qu'ils voient est trompeur. Mais en se coupant de toute lumière il est plus aisé de "voir" ce qu'est vraiment [l]Oneira[/l].
    Actuellement, mon parsing est fait entièrement à la main, en deux passes. Une pour remplacer les balises "simple" du genre [ligne] ou [halo], et une autre pour remplacer les balises complexe du genre [l]Oneira[/l], mais rajouter des balises "complexe" est ardu, et justement je veux rajouter une balise [nobr] pour ne pas transformer les \n en <br /> à l'intérieur. Vu que je suis entrain de refondre complètement le site, j'en profite pour modifier le moteur. Ayant découvert le preg_replace_callback depuis la derniere fois, j'ai envie de l'utiliser, d'autant qu'il me simplifie très largement le boulot.

    Pour répondre à l'idée de découpage "intelligent", c'est assez difficile, car il est tout à fait envisageable que j'ai une balise qui s'ouvre au tout début (genre mon fameux [nobr]) et se ferme beaucoup plus loin...
    Rakken

    Oneira, un monde imaginaire d'Heroic Fantasy.

    Parce que la présomption d'innocence est un des fondements de notre pays et qu'elle doit le rester, dans tous les domaines : http://www.laquadrature.net/

Discussions similaires

  1. [RegEx] Regex récursif pour du bbCode
    Par 123quatre dans le forum Langage
    Réponses: 0
    Dernier message: 08/05/2010, 09h44
  2. Script pour effacement récursif
    Par Filippo dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 09/01/2005, 17h10
  3. Fermeture BBcode
    Par golgot13 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 01/12/2004, 07h19
  4. XPATH XSL Récursif (très débutant!)
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 14
    Dernier message: 24/08/2004, 10h04
  5. idFTP.DirectoryListing récursif + TreeNode
    Par fredfred dans le forum Composants VCL
    Réponses: 3
    Dernier message: 05/07/2004, 15h53

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