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 :

7.2 str_replace me pose problème [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Points : 90
    Points
    90
    Par défaut 7.2 str_replace me pose problème
    Bonjour,

    En fait, je passe d'un vieux PHP à 7
    Je reçois d'une station météo un texte de prévision en anglais (par exemple « Partly cloudy with little temperature » ) que je souhaite traduire en français par simple substitution de mots ou groupes de mots.
    Ce très vieux code (de 2006) ne fonctionnant plus

    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
    // $t contient le texte en anglais
    $t=@preg_replace('cooler',  'plus frais', $t); 
    $t=@preg_replace("Clearing", "s'éclaircissant", $t); 
    $t=@preg_replace("Ending within", "Se terminant dans les", $t); 
    $t=@preg_replace("hours", "heures", $t); 
    $t=@preg_replace("Falling Rapidly","Baisse rapide", $t); 
    $t=@preg_replace("Falling Slowly","Baisse lente", $t); 
    $t=@preg_replace("Heavy at Time","forte par moment", $t); 
    $t=@preg_replace("Increasing Clouds","Nuages en augmentation", $t); 
    $t=@preg_replace("Increasing Winds","Vent en augmentation", $t); 
    $t=@preg_replace("Precipitation" , "Pluie", $t); 
    $t=@preg_replace("Little Temperature Change","faible écart de température", $t); 
    $t=@preg_replace("Mostly Clear","Le plus souvent clair", $t); 
    $t=@preg_replace("Mostly Cloudy","le plus souvent nuageux", $t); 
    $t=@preg_replace("Partly Cloudy","Partiellement nuageux", $t); 
    $t=@preg_replace("Precipitation Likely","Pluie probable", $t); 
    $t=@preg_replace("Rising Rapidly","hausse rapide", $t); 
    $t=@preg_replace("Rising Slowly","hausse lente", $t); 
    $t=@preg_replace("Steady","stable", $t); 
    $t=@preg_replace("Warmer","plus chaud", $t); 
    $t=@preg_replace("Wind Shift to the W, NW, or N","bascule du vent vers O, NO, ou N", $t); 
    $t=@preg_replace("Within", "dans les", $t); 
    $t=@preg_replace("With","avec", $t); 
    $t=@preg_replace("Windy","Venteux", $t); 
    $t=@preg_replace("likely","probable", $t); 
    $t=@preg_replace("possibly","peut-être", $t); 
    $t=@preg_replace("and","et", $t); 
    $t=@preg_replace("to","Ã*", $t);
    Je me mets donc à jour et j'essaie celui-là qui ne fonctionne pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // $t contient le texte en anglais
    $recherche=array("cooler", "Clearing", "Ending within", "hours", "Falling Rapidly", "Falling Slowly", "Heavy at Time", "Increasing Clouds", "Increasing Winds", "Precipitation" , "Little Temperature Change", "Mostly Clear", "Mostly Cloudy", "Partly Cloudy", "Precipitation Likely", "Rising Rapidly", "Rising Slowly", "Steady", "Warmer", "Wind Shift to the W, NW, or N", "Within", "With", "Windy", "likely", "possibly", "and", "to");
    $remplace = array("plus frais", "s'éclaircissant", "Se terminant dans les", "heures", "Baisse rapide", "Baisse lente", "forte par moment", "Nuages en augmentation", "Vent en augmentation", "Pluie", "faible écart de température", "Le plus souvent clair", "le plus souvent nuageux", "Partiellement nuageux", "Pluie probable", "hausse rapide", "hausse lente", "stable", "plus chaud", "bascule du vent vers O, NO, ou N", "dans les", "avec", "Venteux", "probable", "peut-être", "et", "à");
    $t2=str_replace($recherche,$remplace,$t)	;
    Bien à vous,
    Blaise

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

    la syntaxe à l'air correcte.
    C'est tout ce qu'on peut dire.

  3. #3
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Points : 90
    Points
    90
    Par défaut
    Merci pour la réponse, mais je reste perdu.

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut

    Je ne pas regardé si tout collait, par contre tu devrais présenter ton code différemment :
    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
    $translate = [
        'cooler'        => 'plus frais',
        'Clearing'      => "s'éclaircissant",
        'Ending within' => 'Se terminant dans les',
        'hours'         => 'heures',
        'Falling Rapidly'   => 'Baisse rapide',
        'Falling Slowly'    => 'Baisse lente',
        'Heavy at Time'     => 'forte par moment',
        'Increasing Clouds' => 'Nuages en augmentation',
        'Increasing Winds'  => 'Vent en augmentation',
        'Precipitation'     => 'Pluie',
        'Little Temperature Change' => 'faible écart de température',
        'Mostly Clear'   => 'Le plus souvent clair',
        'Mostly Cloudy'  => 'le plus souvent nuageux',
        'Partly Cloudy'  => 'Partiellement nuageux',
        'Precipitation Likely' => 'Pluie probable',
        'Rising Rapidly' => 'hausse rapide',
        'Rising Slowly'  => 'hausse lente',
        'Steady'   => 'stable',
        'Warmer'   => 'plus chaud',
        'Wind Shift to the W, NW, or N' => 'bascule du vent vers O, NO, ou N',
        'Within'   => 'dans les',
        'With'     => 'avec',
        'Windy'    => 'Venteux', 
        'likely'   => 'probable',
        'possibly' => 'peut-être',
        'and'      => 'et',
        'to'       => 'à'    
    ];
     
    $t2 = str_replace(array_keys($translate), $translate, $t);
    Ainsi, plus aucune incertitude quant à la correspondance exacte des tableaux.

  5. #5
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Points : 90
    Points
    90
    Par défaut
    Merci @rawscr, C'est vrai que c'est bien + clair.

    Cependant, cela ne fonctionne toujours pas.
    Néanmoins, j'ai essayé avec le texte du jour : « Increasing clouds and warmer. Precipitation possible within 24 to 48 hours » et j'ai une très petite avancée : « Increasing clouds et warmer. Pluie possible within 24 à 48 heures »

  6. #6
    Invité
    Invité(e)
    Par défaut
    "ça ne fonctionne pas" ne nous donne AUCUNE information utile !

    QU'EST-CE qui "ne fonctionne pas" ?
    • Message d'erreur ?
    • Le texte n'est pas modifié correctement ?


    N.B. "Increasing Clouds" est différent de "Increasing clouds".
    Dernière modification par Invité ; 14/09/2019 à 17h43.

  7. #7
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    "ça ne fonctionne pas" ne nous donne AUCUNE information utile !!.
    lis bien mon message
    Néanmoins, j'ai essayé avec le texte du jour : « Increasing clouds and warmer. Precipitation possible within 24 to 48 hours » et j'ai une très petite avancée : « Increasing clouds et warmer. Pluie possible within 24 à 48 heures »
    Rien n'était traduit dans la 1ère phrase, et une partie seulement dans cette seconde.

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    C'est normal, tu dois voir comment le parseur fonctionne.
    Déjà il est sensible à la casse, donc il différencie les majuscules et les minuscules ensuite il est linéaire, donc s'il rencontre dans le texte en cours de remplacement une valeur qui a déjà été remplacée et que cette nouvelle valeur est à nouveau remplaçable, il va la remplacer à nouveau... Donc l'ordre des mots à remplacer est très important
    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
    $words = [
        'possibly' => 'peut-être',
        'clearing' => "s'éclaircissant",
        'cooler'   => 'plus frais',
        'likely'   => 'probable',
        'steady'   => 'stable',
        'warmer'   => 'plus chaud',
        'within'   => 'dans les',
        'hours'    => 'heures',
        'windy'    => 'venteux',
        'with'     => 'avec',
        'and'      => 'et',
        'to'       => 'à',
    ];
    $phrases = [
        'wind shift to the w, nw, or n' => 'bascule du vent vers o, no, ou n',
        'little temperature change' => 'faible écart de température',
        'precipitation likely' => 'pluie probable',
        'increasing clouds' => 'nuages en augmentation',
        'increasing winds' => 'vent en augmentation',
        'falling rapidly' => 'baisse rapide',
        'falling slowly' => 'baisse lente',
        'rising rapidly' => 'hausse rapide',
        'ending within' => 'se terminant dans les',
        'heavy at time' => 'forte par moment',
        'precipitation' => 'pluie',
        'rising clowly' => 'hausse lente',
        'mostly cloudy' => 'le plus souvent nuageux',
        'partly cloudy' => 'partiellement nuageux',
        'mostly clear'  => 'le plus souvent clair',
    ];
     
    $str = 'Increasing clouds and warmer. Precipitation possible within 24 to 48 hours';
    $x   = str_ireplace(array_keys($phrases), $phrases, $str);
    $t2  = str_ireplace(array_keys($words), $words, $x);
    Ensuite tu formates le texte avec les majuscules comme tu veux

  9. #9
    Membre régulier
    Homme Profil pro
    Touche à tout
    Inscrit en
    Mars 2009
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Touche à tout

    Informations forums :
    Inscription : Mars 2009
    Messages : 120
    Points : 90
    Points
    90
    Par défaut
    Voilà,

    Oui, j'ai d'abord pensé à l'ordre des mots, mais le "and" en début de phrase a été substitué alors qu'il se trouve en bas de tableau.

    En regardant le code proposé par toi, @rawscr, j'ai vu les majuscules et j'ai regardé si la fonction était sensible à la casse, et elle l'est. La solution est d'utiliser str_ireplace

    https://www.php.net/manual/en/function.str-ireplace.php

    Merci à tous

  10. #10
    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
    Quitte à sacrifier la casse, autant passer la chaîne de départ par strtolower puis utiliser strtr à la place de str_replace ou str_ireplace.
    Avantages:
    • pas besoin de créer 36 tableaux, un seul tableau associatif suffit (que l'on peut utiliser tel quel)
    • strtr ne fait qu'une seule passe et pas une passe par terme comme str_replace ce qui évite les remplacements circulaires.
    • l'ordre des termes dans la tableau n'a pas d'importance, strtr choisit la plus grande correspondance par défaut.


    Donc:
    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
    $trans = [
        'possibly' => 'peut-être',
        'clearing' => "s'éclaircissant",
        'cooler'   => 'plus frais',
        'likely'   => 'probable',
        'steady'   => 'stable',
        'warmer'   => 'plus chaud',
        'within'   => 'dans les',
        'hours'    => 'heures',
        'windy'    => 'venteux',
        'with'     => 'avec',
        'and'      => 'et',
        'to'       => 'à',
        'wind shift to the w, nw, or n' => 'bascule du vent vers O, NO, ou N',
        'little temperature change' => 'faible écart de température',
        'precipitation likely' => 'pluie probable',
        'increasing clouds' => 'nuages en augmentation',
        'increasing winds' => 'vent en augmentation',
        'falling rapidly' => 'baisse rapide',
        'falling slowly' => 'baisse lente',
        'rising rapidly' => 'hausse rapide',
        'ending within' => 'se terminant dans les',
        'heavy at time' => 'forte par moment',
        'precipitation' => 'pluie',
        'rising clowly' => 'hausse lente',
        'mostly cloudy' => 'le plus souvent nuageux',
        'partly cloudy' => 'partiellement nuageux',
        'mostly clear'  => 'le plus souvent clair',
    ];
     
    $str = strtr(strtolower($str), $trans);
     
    // pour remettre des majuscules en début de phrase:
     
    $str = preg_replace_callback('~(?:\A|[.?!] )\K\pL~u', function ($m) { return mb_strtoupper($m[0]); }, $str);
     
    echo $str;
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  11. #11
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Il faut noter que la fonction strtr() dans sa forme standard strtr ( string $str , string $from , string $to ) : string n'est pas compatible unicode (utf-8), par contre elle le devient dans sa notation tableau : strtr ( string $str , array $replace_pairs ) : string, exactement comme le fait CosmoKnacki

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

Discussions similaires

  1. CFormView::OnIntialUpdate() pose problème
    Par jacklafrip dans le forum MFC
    Réponses: 1
    Dernier message: 26/09/2006, 15h37
  2. caractère \ pose problème
    Par questionneuse dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 11/07/2006, 16h25
  3. Un cast de SmartPointer qui pose probléme
    Par Higestromm dans le forum C++
    Réponses: 3
    Dernier message: 13/10/2005, 10h25
  4. jointure externe avec un where, me pose problème!
    Par Danae dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/07/2005, 17h37
  5. Réponses: 3
    Dernier message: 17/05/2005, 11h16

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