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 :

preg_replace() vers preg_replace_callback()


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Points : 6
    Points
    6
    Par défaut preg_replace() vers preg_replace_callback()
    Un peu compliqué pour moi malgré la doc... Si qqln sait convertir facilement ce filtre pour un "content" wordpress qui marche avec php5 mais qui est déprécié dans php7.
    Il s'agit de remplacer preg_replace par preg_replace_callback.
    Le truc un peu compliqué c'est au niveau de la function{} qui arrive à la place de (par exemple) '<img$1data-$2$3>' ou '<img$1class="$2 lazy-load"$3>' ou '<img class="lazy-load"$1>'
    C'est surtout au niveau de la syntaxe que je sèche...

    Sinon j'ai trouvé cette function
    mais je préférerais adapter l'autre plus "soft".

    Si qqln est suffisamment àlaise ? en PHP ? Merci d'avance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    add_filter('the_content', function ($content) {
    	//-- Change src/srcset to data attributes.
    	$content = preg_replace("/<img(.*?)(src=|srcset=)(.*?)>/i", '<img$1data-$2$3>', $content);
     
    	//-- Add .lazy-load class to each image that already has a class.
    	$content = preg_replace('/<img(.*?)class=\"(.*?)\"(.*?)>/i', '<img$1class="$2 lazy-load"$3>', $content);
     
    	//-- Add .lazy-load class to each image that doesn't already have a class.
    	$content = preg_replace('/<img((.(?!class=))*)\/?>/i', '<img class="lazy-load"$1>', $content);
     
    	return $content;
    });

  2. #2
    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
    Désolé mais ta question est incompréhensible en l'état. Pourrais-tu montrer le code d'origine qui n'est pas compatible avec php7 (car celui que tu as posté est compatible avec php7)?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par CosmoKnacki Voir le message
    Pourrais-tu montrer le code d'origine qui n'est pas compatible avec php7 (car celui que tu as posté est compatible avec php7)?
    C'est le code d'origine. J'ai mis ici toute la fonction. J'ai du lire de travers... si tu me dit que ça fonctionne dans php7.2.
    La fonction est active (si je remplace le code par echo 'est' par exemple) mais elle n'a aucun effet. je pensais que c'était la syntaxe mais apparemment non.
    Je vais donc chercher ailleurs... Merci.

  4. #4
    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
    Sinon en un peu plus blindé, tu peux utiliser cette fonction:
    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
    function add_lazy_loading_to_img($content) {
        $trans = ['src' => 'data-src', 'srcset' => 'data-srcset'];
     
        return preg_replace_callback('~<img((?:\s+[^\s<>]*)*+)>~i', function ($m) use ($trans) {
            // parse attributes
            if ( preg_match_all('~(?<attr> \S [^\s=]* )
                                  (?: =
                                    (?|  (?<q> " ) (?<val> [^"]*  ) " # double quotes
                                      |  (    \' ) (       [^\']* )\' # single quotes
                                      |  (       ) (     \S*      )   # no quotes
                                    )
                                  )?
                                 ~x', rtrim($m[1], '/'), $matches, PREG_SET_ORDER) === false )
                return $m[0];
     
            $img = '<img ';
            $attributes = array_column($matches, 'attr');
     
            // add the class attribute if missing
            if ( !in_array('class', $attributes) )
                $img .= 'class="lazy-load" ';
     
            foreach ($matches as $match) {
                // translate src and srcset to data-src and data-srcset
                $attrlc = strtolower($match['attr']);
                $match['attr'] = isset($trans[$attrlc]) ? $trans[$attrlc] : $match['attr'];
     
                // add missing quotes
                if ( empty($match['q']) )
                    $match['q'] = '"';
     
                if ( $attrlc === 'class' ) {
                    $classes = isset($match['val']) ? preg_split('~\s+~', trim($match['val'])) : [];
                    $classes[] = 'lazy-load'; // add lazy-load class
                    $match['val'] = implode(' ', array_unique($classes)); // remove duplicate classes
                    $match['q'] = '"'; // force double quotes
                }
     
                $img .= isset($match['val']) ? "{$match['attr']}={$match['q']}{$match['val']}{$match['q']} "
                                             : "${match[0]} ";
            }
     
            return $img . '/>';    
     
        }, $content);
    }
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2019
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2019
    Messages : 17
    Points : 6
    Points
    6
    Par défaut
    Merci, je vais la tester...

Discussions similaires

  1. [PHP 7] Modification Preg_replace en Preg_replace_callback
    Par inconnul dans le forum Langage
    Réponses: 2
    Dernier message: 02/11/2018, 18h56
  2. [RegEx] preg_replace() et preg_replace_callback
    Par sam01 dans le forum Langage
    Réponses: 2
    Dernier message: 10/05/2016, 10h28
  3. Preg_replace to preg_replace_callback
    Par piratack007 dans le forum Langage
    Réponses: 8
    Dernier message: 15/12/2015, 20h19
  4. [PHP 5.5] preg_replace remplacé par preg_replace_callback
    Par nemox31 dans le forum Langage
    Réponses: 1
    Dernier message: 22/10/2015, 22h13
  5. [RegEx] transformer un preg_replace en preg_replace_callback (migration)
    Par le korrigan dans le forum Langage
    Réponses: 8
    Dernier message: 23/07/2015, 11h37

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