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 :

str_replace exact pattern


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 69
    Par défaut str_replace exact pattern
    Je cherche a ce que le pattern exact soit remplace.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $phrase  = "Il est important de selectionner les bonnes chaussettes";
    echo $phrase. "<br>";
    $healthy = array("SELECT", "FROM", "WHERE", "DROP", "JOIN", "INNER JOIN", "LEFT JOIN", "RIGHT JOIN", "HAVING", "GROUP BY", "ORDER BY", "TRUNC", "TRUNCATE", "SET");
    $newphrase = str_ireplace($healthy, " ", $phrase);
    echo $newphrase;
    Auriez vous une idee de comment je peux procéder §

    Merci
    FS

  2. #2
    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 : 40
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    En d'autres termes, tu veux remplacer "select" dans "select" mais pas dans "selectionner" ou "unselect".

    Tu peux essayer en encadrant ton pattern avec des espaces (et/ou les ponctuations autorisées genre , ou , ou alors avec des regex du genre "select" non précédé par une lettre et non suivi par une lettre.
    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]

  3. #3
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 986
    Par défaut
    Bonjour,

    moi, j'aurai fait quelque chose dans ce genre, pour préserver la ponctuation et les césures.

    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
    <?php
    $phrase = <<<EOD
    drop Il est left join important de having selectionner join:
    - inner join les bonnes select chaussettes right join.
    -select les bonnes chaussures.
    where Le truncate modèle à carreaux ne serait set-il pas group by plus aproprié order by avec des mocassins from à glands where?
    À quel numéro puis-je vous join-
    dre pour vous faire essayer nos nouveaux modèles?
    EOD;
    $healthy = array( 'DROP', 'FROM', 'GROUP BY', 'HAVING', 'INNER JOIN', 'JOIN', 'LEFT JOIN', 'ORDER BY', 'RIGHT JOIN', 'SELECT', 'SET', 'TRUNC', 'TRUNCATE', 'WHERE' );
     
    $pattern = '`(?:(^|\n)|\h|(.))(?<![a-zàâäéèêëîïôöûüæœÀÂÄÉÈÊËÎÏÔÖÛÜÆŒ]-\n)\b(?:' . implode( '|', $healthy ) . ')\b(?!-\n)(?(1)(?:\h|(.))|(.))`i';
    $newphrase = preg_replace( $pattern, "$1$2$3$4", $phrase );
     
    echo '<pre>' . $phrase . '<br/><br/>' . $newphrase . '</pre>';
    ?>
    détail de la pattern:
    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
    /* on a ici le contenu de $pattern à la différence prés qu'on utilise à la fin le modifier 'x' pour y insérer des commentaires et pouvoir l'espacer comme on veut.  Les espaces sont donc ici désignés explicitement par \h */
    $pattern = '`
                 # le mot à enlever peut être précédé: d un début de chaine ^ ou de ligne \n, d un espace \h, ou de n importe quel autre caractère
                 (?: ( ^ | \n ) | \h | ( . ) )
     
                 # test arrière négatif : le mot ne doit pas être la fin d une césure
                 (?<! [a-zàâäéèêëîïôöûüæœÀÂÄÉÈÊËÎÏÔÖÛÜÆŒ]-\n )
     
                 # les mots à éliminer sont encadrés avec \b pour qu il n y ait pas de correspondances à l intérieur d autres mots
                 \b(?:DROP|FROM|GROUP\hBY|HAVING|INNER\hJOIN|JOIN|LEFT\hJOIN|ORDER\hBY|RIGHT\hJOIN|SELECT|SET|TRUNC|TRUNCATE|WHERE)\b
     
                 # test avant négatif : le mot ne doit pas être le début d une césure
                 (?! -\n )
     
                 # test ternaire :
                 #     si le groupe 1 est capturé alors :
                 #         on élimine l éventuel espace après le mot ou on capture le prochain caractère dans le groupe 3,
                 #         sinon on capture le prochain caractère dans le groupe 4
                 (?(1)
                     (?: \h | ( . ) )
                   | ( . )
                 )
     
                 # modifiers : i --> insensible à la casse, x --> mode commentaire
                `ix';
    Pour retirer/ajouter une fonctionnalité comme la gestion des espaces ou des césures, il suffit d'enlever/remettre les lignes correspondantes comme par exemple dans 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
    /**
     * @param array $terms 
     * @param string $text
     * @param flag $mode
     * @param bolean $display_pattern
     */
    define ( 'RTERMS_BASIC', 0 );
    define ( 'RTERMS_ENTIRE_WORDS', 1 );
    define ( 'RTERMS_WORD_BREAKS', 2 );
    define ( 'RTERMS_SPACES', 4 );
    define ( 'RTERMS_ALL', 6 );
     
    function rterms ( $terms, $text, $mode = RTERMS_BASIC, $display_pattern = false ) {
        $pattern = implode ( '|', $terms );
        $replacement = '';
        if ( $mode >= RTERMS_ENTIRE_WORDS )
            $pattern = '\b(?:' . $pattern . ')\b';
        if ( $mode & RTERMS_WORD_BREAKS )
            $pattern = '(?<![a-zàâäéèêëîïôöûüæœÀÂÄÉÈÊËÎÏÔÖÛÜÆŒ]-\n)' . $pattern . '(?!-\n)';
        if ( $mode & RTERMS_SPACES ):
            $pattern = '(?:(^|\n)|\h|(.))' . $pattern . '(?(1)(?:\h|(.))|(.))';
            $replacement = '$1$2$3$4';
        endif;
        $pattern = '`' . $pattern . '`i';
        if ( $display_pattern ) echo '<pre>' . htmlspecialchars( $pattern ) . '</pre>';
        return preg_replace( $pattern, $replacement, $text);
    }

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  2. [langage] recherche exactement un modif
    Par toto_titi dans le forum Langage
    Réponses: 3
    Dernier message: 04/07/2003, 11h00
  3. [langage] expression reguliere motif répétitif dans 1 pattern
    Par comme de bien entendu dans le forum Langage
    Réponses: 11
    Dernier message: 09/04/2003, 16h14
  4. Qu'est-ce que c'est que Nessus, ça fait quoi exactement ?
    Par PeterT dans le forum Développement
    Réponses: 3
    Dernier message: 24/07/2002, 11h23
  5. C'est quoi exactement un générateur d'états
    Par Henry Cesbron Lavau dans le forum Outils de restitution et d'analyse
    Réponses: 0
    Dernier message: 02/04/2002, 19h15

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