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() remplacement partiel.


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Femme Profil pro
    fdghfdgh
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : fdghfdgh

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Points : 17
    Points
    17
    Par défaut preg_replace() remplacement partiel.
    Bonjour,
    j'ai un problème concernant un remplacement ou en tout cas concernant mon but.

    Je recherche à enlever le "blabla." dans les chaines de type "blabla.domaine.com" .

    L'action se résumerait donc à l'opération suivante :
    (sous-domaine.domaine.ext) - (sous-domaine.) = domaine.ext

    Inconnues pures: "sous-domaine", "domaine"
    Inconnu partiel: "ext" ( les extensions de domaine sont connu )

    J'ai bien sûr passer quelques heures dans le manuel en recherchant la fonction qui va bien et je n'ai trouvé que preg_replace() qui peut convenir quand le $replacement est sous une forme obscure pour moi avec des choses de la forme $n ou n représente la n-ième parenthèse fermante du $pattern. (selon le manuel).

    J'ai essayé de nombreuses fois mais je n'y arrive pas , d'ailleurs je ne sais même pas si preg_replace() est la bonne fonction pour arriver à mon but mais je n'ai rien trouver d'autre.

    Si vous souhaitez d'autres information , je suis là.
    Merci

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je te propose ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
    $chaine = "titi.toto.zozo.com";
    preg_match("#^.*\.(.*\..*)$#", $chaine, $match);
    echo $match[1];
    ?>
    Ca se lit comme ça :
    ^ : une chaine qui commence par
    .* : une série de caractère (titi.toto)
    \. : un point
    .* : à nouveau une série de caractère (zozo)
    \. : à nouveau un point
    .* : encore une série de caractère (com)
    $ : et est terminée

    les parenthèses delimite la partie que tu veux recuperer.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Femme Profil pro
    fdghfdgh
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : fdghfdgh

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Et moi je te propose un grand merci , j'étais encore en train de chercher quand je me suis dit d'aller voir un peu sur le forum au cas où, et je tombe sur ta réponse. Quelle bonne surprise.

    Je vais enfin pouvoir terminer mon script anti proxy ouvert qui loin d'être parfait limitera la casse. Il se sert des listes du web mis à jour plusieurs fois par jours.

    On verra bien si ça marche un petit peu.

  4. #4
    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
    Je milite encore et toujours pour la limitation à son strict minimum de l'utilisation du .*

    Vu l'expression de besoin, ceci sera mieux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    $chaine = "titi.toto.zozo.com";
    preg_match("#^.*\.([^.]+\.[^.]+)$#", $chaine, $m);
    print_r($m);
    • 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

  5. #5
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    j'ai pas bon.

    Pourquoi il ne faut pas utiliser .* ?
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  6. #6
    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 sabotage Voir le message
    j'ai pas bon.
    Si, c'est bon. Et pour tout avouer, la différence ne se ferait que sur des gros volumes.
    Pourquoi il ne faut pas utiliser .* ?
    Parce que c'est la solution de facilité.
    Mais aussi parce que ça manque de contrôle et que ce n'est pas performant.
    Pour illustrer, je reprends ton explication qui était très claire :

    --- edit ---
    L'expliaction suivante est incorrecte et sera corrigée par le post suivant.
    --- fin edit ---

    pattern ^.*\.(.*\..*)$

    ^ : une chaine qui commence par
    .* : une série de caractère (titi.toto) => en fait, la chaîne complète est lue à ce stade. match = titi.toto.zozo.com
    \. : un point => la chaîne complète qui était en mémoire fait machine arrière, lettre par lettre, pour trouver un point. match = titi.toto.zozo
    .* : à nouveau une série de caractère (zozo) => je relis toute la chaîne. match = titi.toto.zozo.com
    \. : à nouveau un point => je refais machine arrière
    .* : encore une série de caractère (com) => je relis jusqu'au bout
    $ : et est terminée


    pattern ^.*\.([^.]+\.[^.]+)$

    ^ : une chaine qui commence par
    .* : une série de caractère (titi.toto) => en fait, la chaîne complète est lue à ce stade. match = titi.toto.zozo.com
    \. : un point => la chaîne complète qui était en mémoire fait machine arrière, lettre par lettre, pour trouver un point. match = titi.toto.zozo
    [^.]+ : à nouveau une série de caractère (zozo) => le point après zozo ne correspondant pas, je remonte pour trouver un point suivi de lettres sans point : match = titi.toto.zozo
    \. : à nouveau un point => je continue en marche avant d'un caractère
    [^.]+ : encore une série de caractère (com) => je continue tranquillement jusqu'au bout
    $ : et est terminée

    Comme on peut s'en rendre compte, le gain sera sûrement négligeable sur un petit volumes. Mais si toutes les machines arrières (backtracking) devaient se répéter des milliers (millions) de fois, la différence serait notable.
    • 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

  7. #7
    Membre à l'essai
    Femme Profil pro
    fdghfdgh
    Inscrit en
    Août 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : fdghfdgh

    Informations forums :
    Inscription : Août 2009
    Messages : 22
    Points : 17
    Points
    17
    Par défaut
    Voilà comment je comprend après une heure de réflexion ( oui rien que ça ):

    ^ : une chaine qui commence par
    .* : une série de caractère (titi.toto) => en fait, la chaîne complète est lue à ce stade. match = titi.toto.zozo.com
    \. : un point => la chaîne complète qui était en mémoire fait machine arrière, lettre par lettre, pour trouver un point. match = titi.toto.zozo
    [^.]+ : à nouveau une série de caractère (com). match = titi.toto.zozo.com
    \. : à nouveau un point => je fais marche arrière pour trouver un point avec une chaine correspondant au calque déjà lu, match = titi.toto.zozo
    [^.]+ : encore une série de caractère (com) => je continue tranquillement jusqu'au bout, match = tit.toto.zozo.com
    $ : et est terminée

    => ([^.]+\.[^.]+) est bien positionné sur zozo.com qu'on extrait avec $match['1']

    J'ai changé une ou 2 explications.
    J'ai compris ou pas ?

    En tout cas c'est très intéressant , merci à tout les 2.

  8. #8
    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
    Exactement.

    Enfin presque puisque qu'il faudrait changer ces deux phrases pour être vraiment précis :

    \. : un point => la chaîne complète qui était en mémoire fait machine arrière, lettre par lettre, pour trouver un point. match = titi.toto.zozo.

    \. : à nouveau un point => je fais marche arrière pour trouver un point avec une chaine correspondant au calque déjà lu, match = titi.toto.zozo.

    Le point derrière zozo fait partie du matching.

    Ceci dit, je suis mal placé pour faire le prof car comme tu l'as remarqué, mes explications étaient inexactes.

    Bravo !
    • 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

Discussions similaires

  1. [RegEx] preg_replace remplacer des guillemets
    Par Invité dans le forum Langage
    Réponses: 19
    Dernier message: 07/09/2011, 16h19
  2. [RegEx] preg_replace remplacement précis
    Par guillaume40 dans le forum Langage
    Réponses: 11
    Dernier message: 21/12/2009, 14h54
  3. [RegEx] Preg_replace, remplacement PHP
    Par Klyne2 dans le forum Langage
    Réponses: 13
    Dernier message: 18/10/2009, 00h34
  4. [RegEx] Preg_replace remplacer plusieurs fois une variable
    Par C45T0R dans le forum Langage
    Réponses: 2
    Dernier message: 24/10/2008, 14h39
  5. Remplacement partiel d'un mot clé par un autre
    Par Metallic-84s dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/04/2006, 15h45

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