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 :

Question performance avec preg_replace_callback() [RegEx]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 300
    Par défaut Question performance avec preg_replace_callback()
    Bonjour,

    Je souhaiterais savoir, en terme de performance que vaut-il mieux faire pour un grand nombre d'appel au premier ou deuxième cas : (simple exemple, ne pas tenir compte des balises, etc..)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        $texte = preg_replace_callback('`\[1\].+\[/1\]`iU', array($this,'test'), $texte);
        $texte = preg_replace_callback('`\[2\].+\[/2\]`iU', array($this,'test'), $texte);
        $texte = preg_replace_callback('`\[3\].+\[/3\]`iU', array($this,'test'), $texte);
        $texte = preg_replace_callback('`\[4\].+\[/4\]`iU', array($this,'test'), $texte);
        $texte = preg_replace_callback('`\[5\].+\[/5\]`iU', array($this,'test'), $texte);
        $texte = preg_replace_callback('`\[6\].+\[/6\]`iU', array($this,'test'), $texte);
    OU

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        //$texte = preg_replace_callback('`\[(1|2|3|4|5|6)\].+\[/(1|2|3|4|5|6)\]`', array($this,'test'), $texte);
    Avec dans la fonction test la gestion de si la valeur 1 et bien égale à la valeur 2.

    N'est pas la seconde qui est le plus long finalement, même si l'on ne fait appel qu'à un seul preg_replace_callback(), du fait qu'il doit comparer 1 devant pour 1|2|3|... dernière et ainsi de suite ?

    Merci de votre aide et avis.

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Salut !

    le problème dans ton second exemple est que tu autorise quelque chose de ce style :
    [1]bla bla bla[/6]
    je te conseillerais d'utiliser un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        //$texte = preg_replace_callback('`\[(1|2|3|4|5|6)\].+\[/\\1\]`', array($this,'test'), $texte);
    qui obligera à matcher ce qui a été trouvé lors de la première prise...

    ensuite, je pense qu'il est plus léger (donc plus performant de ne faire qu'un seul appel plutôt que 6 dans ce cas en tous cas...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 300
    Par défaut
    merci de ta réponse.

    En fait le truc c'est que dans la fonction qui est appellée dans le calback je test si par exemple $1 est == $5 pour vérifier l'ouverture et la fermeture. A vrai dire je ne savais pas que l'on pouvait utiliser le résultat directement dans la même "requête".

    En revanche je me suis toujours servit de $1. Quel est la différence avec \\1 ?

  4. #4
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    en fait, le \\1 (\1 en fait puisque le \\ est transformé en \ après interprétation dans les ' ') est ce qu'on appelle une référence arrière, et ne doit (et ne peut) être utilisé que dans les patterns, pas dans les "masques" de remplacemet

    en gros il s'agit surtout du "lieu" d'utilisation qui est différent ^^
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 300
    Par défaut

    Mais pourtant j'ai déjà vu des \\1 dans le résultat.
    Un exemple de la doc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    preg_replace("/(<\/?)(\w+)([^>]*>)/e",
                 "'\\1'.strtoupper('\\2').'\\3'",
                 $html_body);
    Ou alors je n'ai rien compris ?
    En fait il faut utiliser le \\1 dans le preg_replace, etc.. et non pas le $1 parce qu'il peut être utilisé ailleurs ?

  6. #6
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    perso, j'ai toujours utilisé le $ dans preg_replace, et n'ai jamais eu de problèmes avec...

    Je ne pensais pas que le \\ soit accepté... à priori, il s'agit surtout de considération personnelles, perso je préfère toujours le $... plus clair
    par contre je suis sûr que la syntaxe avec le $ ne peut être utilisée dans les recherches à cause de la signification du $ (fin de ligne/chaine)

    après reflexion, la syntaxe en \\ permet surtout d'éviter l'interprétation du $1 en tant que variable quand il est entre " " ... enfin, suffit d'utiliser des simples quotes ou d'échaper les $ et on retombe sur le même problème...

    principalement un choix perso donc
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

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

Discussions similaires

  1. Question de performance avec les HashMap
    Par User Name dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 05/10/2012, 18h17
  2. Question performance avec SQL server 2000
    Par zooffy dans le forum ASP.NET
    Réponses: 12
    Dernier message: 15/10/2007, 09h10
  3. Réponses: 14
    Dernier message: 09/08/2004, 13h42
  4. problemes de performances avec les requetes select
    Par berry dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/07/2003, 13h39
  5. [JDBC][connexion persistante] performances avec JDBC
    Par nawac dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 06/05/2003, 10h37

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