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 :

Fonction PHP qui fonctionne bien mais qui génére des millions de lignes dans error_log [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 293
    Points : 77
    Points
    77
    Par défaut Fonction PHP qui fonctionne bien mais qui génére des millions de lignes dans error_log
    Bonjour,

    Il y a plusieurs années j'ai trouvé une fonction PHP sur Internet qui est très utile, qui permet par exemple de détecter un mot dans une chaine avec ou sans astérisques et qui permet donc de bannir ce mot détecté.
    Voici le code:

    Code php : 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
     
    function match_string($pattern, $str)
    {
      $pattern = preg_replace('/([^*])/e', 'preg_quote("$1", "/")', $pattern);
      $pattern = str_replace('*', '.*', $pattern);
      return (bool) preg_match('/^' . $pattern . '$/i', $str);
    }
    // (ne fonctionne pas sur PHP 7 ? et il fonctionne sur PHP 5.6 avec des millions d'alertes dans error_log)
    /*
    Example:
     
    match_string("*world*","hello world") // returns true
    match_string("world*","hello world") // returns false
    match_string("*world","hello world") // returns true
    match_string("world*","hello world") // returns false
    match_string("*ello*w*","hello world") // returns true
    match_string("*w*o*r*l*d*","hello world") // returns true
     
    */


    Voici les millions de lignes générés dans "error_log" avec PHP 5.6:
    Code txt : Sélectionner tout - Visualiser dans une fenêtre à part
    [20-Jun-2018 00:54:56 Europe/Paris] PHP Deprecated:  preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in ..... on line 4

    Est-ce que quelqu'un sait comment arranger la ligne N°4 "preg_replace" pour qu'elle soit compatible à la fois sur PHP 5.6 et PHP 7 ?

    Merci d'avance.
    Salutations.

    PS: Le code PHP il vient de : https://stackoverflow.com/a/5622211 (en 2011)

  2. #2
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Tout est dans le message d'erreur.
    Il te faut remplacer preg_replace par preg_replace_callback...

    L'étape que tu ne connais pas apparemment, c'est "comment accéder au manuel PHP' ?

    http://php.net/manual/fr/function.pr...e-callback.php

    Lis tout tranquillement et va voir les exemples, tu trouves toujours sur ces pages, ou quasiment, un truc utile dans les exemples.

    PS : tu ne peux pas dire "tout fonctionne bien" sauf que ça "génère des alertes"... un peu comme tu ne peux pas dire "Tout va bien à la maison sauf que j'ai une alarme incendie qui hurle..."

    edit : le fond de ton problème est le suivant => fonction preg_replace

    Lorsque vous utilisez l'option obsolète e, cette fonction échappe quelques caractères (', ", \ et NULL) dans la chaîne qui remplace les références arrières. Ce comportement se justifie afin d'assurer qu'aucune erreur de syntaxe ne survient lors de l'utilisation des références arrières avec des guillemets simples et doubles (e.g. 'strlen(\'$1\')+strlen("$2")'). Assurez-vous d'être familier avec la syntaxe des chaînes afin de savoir exactement à quoi la chaîne interprétée doit ressembler.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 293
    Points : 77
    Points
    77
    Par défaut
    L'étape que tu ne connais pas apparemment, c'est "comment accéder au manuel PHP' ?

    http://php.net/manual/fr/function.pr...e-callback.php
    Je connais déjà cette page j'y suis déjà aller voir. En fait j'ai ce problème depuis 1 an environ et j'ai consulté ce manuel il y a quelques mois mais je suis dans l'incapacité de le convertir, du coup j'avais abandonné l'affaire et j'ai eu l'idée de supprimer ce fichier "error_log" une fois par mois (environ 2Go) mais il est temps que je me bouge pour venir poster ça sur un forum pour qu'un connaisseur me fasse ça en 5-10 minutes car moi j'ai bien perdu 2h en cumulé depuis ses 12 derniers mois, je n'ai vraiment plus du tout l'envie de perdre mon temps avec la fonction "preg_replace_callback" que je ne comprend pas.

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    venir poster ça sur un forum pour qu'un connaisseur me fasse ça en 5-10 minutes car moi j'ai bien perdu 2h en cumulé depuis ses 12 derniers mois, je n'ai vraiment plus du tout l'envie de perdre mon temps avec la fonction "preg_replace_callback" que je ne comprend pas
    Bonjour,
    Je pense que tu n'as pas bien compris le fonctionnement du forum.

    Nous sommes là pour apporter une aide , pas pour faire le travail à ta place. Si tu veux rien faire , y'a plein de gens qui sont près à te faire le boulot moyennant de l'argent.

    Maintenant si tu veux faire l'effort d'essayer quelque chose avec les pistes évoquées précédemment , tu trouvera surement de l'aide pour arriver à faire ce que tu veux , mais effectivement faudra fournir un petit effort.

    Les étapes :
    - Utiliser preg_replace_callback à la place de preg_replace
    - Supprimer le modificateur "e"
    - Placer le second argument de la fonction ('preg_quote("$1", "/")') dans un callback ou une fonction anonyme et du coup changer $1 par le paramètre passer à la fonction.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    En gros, il faut que tu écrives une fonction qui prend le tableau matches en entrée et applique la fonction de ton pattern de remplacement avant de renvoyer le résultat.
    Exemple : si ton pattern de remplacement était , la fonction callback sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function ($m) {
            return 'Youpi : '.$m[1].' -- '.$m[2] ;
        }
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    tu peux lire cette réponse.

  7. #7
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 293
    Points : 77
    Points
    77
    Par défaut
    Code php 7 : 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
    <?php
     
    function match_string($pattern, $str)
    {
    	$pattern = preg_replace_callback('/([^*])/', 'testPRC', $pattern);
    	$pattern = str_replace('*', '.*', $pattern);
    	return (bool) preg_match('/^' . $pattern . '$/i', $str);
    }
     
    function testPRC($m) {
    	return preg_quote($m[1],"/");
    }
     
     
    echo match_string("*world*","hello world"); // returns true
    echo match_string("world*","hello world"); // returns false
    echo match_string("*world","hello world"); // returns true
    echo match_string("world*","hello world"); // returns false
    echo match_string("*ello*w*","hello world"); // returns true
    echo match_string("*w*o*r*l*d*","hello world"); // returns true


    PHP Tester online: http://sandbox.onlinephpfunctions.co...fcf626b9acd274

    Ca à l'air de fonctionner. C'est top merci de votre aide c'est la première fois que j'essaye de résoudre quelque chose sur un forum sans qu'on me donne le code directement. Il faut juste avoir de la patience et de la motivation et un petit coup de pouce par un forum.
    Savez-vous si ce code peut tenir longtemps dans les versions PHP 7 ?

    Je vais l'essayer dans mon script original que j'ai depuis 1 an juste pour la journée pour voir s'il peut tenir le coup.

  8. #8
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Savez-vous si ce code peut tenir longtemps dans les versions PHP 7 ?
    Personne peux vraiment le dire. Pour l'instant il n'ya pas de dépréciation en vue pour ces fonctions , donc tu devrais être tranquille pour les quelques années à venir.
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    293
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 293
    Points : 77
    Points
    77
    Par défaut
    Je l'ai posté ici aussi : https://stackoverflow.com/questions/...-with-asterisk (tout en bas)

    Je met sur résolu.


    Salutations.

  10. #10
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Pour la peine je te donne le premier +1 de ta carrière sur stackoverflow
    C'est important de partager des modifs sur un code qui t'a rendu service
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    À noter que la réponse de @Czechnology sur ce post est loin d'être mauvaise.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  12. #12
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    À noter que la réponse de @Czechnology sur ce post est loin d'être mauvaise.
    Ce code là ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function match_string($patt, $haystack) {
      $regex = '|^'. str_replace('\*', '.*', preg_quote($patt)) .'$|is';
      return preg_match($regex, $haystack);
    }
    Si je comprends bien, au lieu d'appliquer preg_quote via une callback, il l'appelle directement ? ça va avoir un résultat équivalent ?
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  13. #13
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    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 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Oui, preg_quote va échapper les caractères spéciaux y compris les astérisques, ensuite il remplace les astérisques échappés par .*.
    Là où il a été malin, c'est que pour éviter de renseigner le deuxième paramètre de preg_quote et échapper un caractère de plus, il a choisi le caractère spécial | comme délimiteur pour sa pattern.

    La seule différence c'est que sa fonction ne renverra pas de booléen (sauf en cas d'erreur) et qu'il a ajouté le modificateur s pour que le point matche aussi les nouvelles lignes.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

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

Discussions similaires

  1. SWF qui fonctionne bien, mais pas sur navigateur
    Par zecreator dans le forum Flash
    Réponses: 2
    Dernier message: 18/10/2016, 20h02
  2. Réponses: 4
    Dernier message: 05/04/2011, 11h42
  3. Réponses: 2
    Dernier message: 07/02/2011, 09h39
  4. [MySQL] INSERT INTO qui ne fonctionne pas mais qui fonctionne
    Par quiky dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 09/12/2009, 15h31
  5. Session qui fonctionne pas et qui fonctionne
    Par Piett dans le forum Langage
    Réponses: 2
    Dernier message: 06/05/2008, 13h41

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