Remplaceer tiret long par tirer (celui du 6 lol )

Avatar du membre
Eléphant du PHP | 224 Messages

19 juil. 2017, 01:31

Hellooo :)

Voilà, je cale sur une broutille à laquelle je ne trouve pas de solution.

Via un form method POST, j'alimente ou modifie une base de données, dans laquelle j'ai un champ "titre" .

Dans le form, je remplis manuellement le champs input text avec le titre que je veux, généralement de forme :
un artiste - un titre (une version)

Les données recueillies à la validation du form, passent dans diverses opérations pour mettre la casse en forme de façon à obtenir quelques chose dans le format suivant :
Un Artiste - Un titre (Une Version)

Il arrive que j'aille faire un copier coller depuis le site discogs pour remplir le champ dans le form.
Par exemple :
https://www.discogs.com/fr/FPI-Project- ... ase/675841

Je copie la ligne FPI Project ‎– Rich In Paradise mais :
1) Le tiret n'est pas un tiret (celui du 6) mais un tiret long.
2) Après Project, ce n'est pas qu'un espace mais un espace suivi de ‎ puisque dans la base de données je me retrouve avec FPI Project ‎– Rich In Paradise
(Notons qu'il y a un espace au début de l'ensemble mais pas évident à le montrer sur le forum).

Pour la gestion de l'espace du début et du ‎ , cela ne me pose pas de problème, mais en revanche pour le tiret long, je ne m'en sort pas.

J'ai tenté divers codes :

Code : Tout sélectionner

$titre = str_replace("‎–", "-", $titre );
Ne marche pas.

Si mon autre page où je peux juste lire la DB, je surligne le – et fais clic droit , recherche google, il m'est indiqué que c'est le caractère "en dash", qui a pour code – ou encore –

Donc je teste :

Code : Tout sélectionner

$titre = str_replace("–", "-", $titre );
Ne marche pas non plus.

Code : Tout sélectionner

$titre = str_replace("–", "-", $titre );
Ne donne rien de mieux, mon tiret long reste tirer long :(

Si quelqu'un a une idée je suis preneur car là je sais même pas où chercher :(

Merci
Couin
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

19 juil. 2017, 11:13

Fais un var_dump() de la donnée que tu récupères, et ensuite fait un copié-collé du tiret tel qu'il s'affiche dans el var_dump (soit sous forme de tiret, soit sous forme d'entité HTML &xxxx;)

Ensuite un simple str_replace() devrait faire le job.

Si ça ne marche pas, fait une page PHP vierge en mettant en dur le texte repris de ton var_dump, puis echo du str_replace() pour voir si ça fonctionne.

Un point de vigilance : il faut que ton traitement soit en utf8 pour éviter les problèmes donc au niveau de la connexion à la BDD impose de l'utf8 et idem au début de ta page PHP :
header('Content-Type: text/html;charset=UTF-8');
Si le problème persiste, met nous ici ton code de test (avec le texte en dur)
Quand tout le reste a échoué, lisez le mode d'emploi...

Avatar du membre
Eléphant du PHP | 224 Messages

19 juil. 2017, 14:26

Hello,

Merci pour ta réponse rapide :)

Alors, ma DB est en utf8-bin, mes fichiers php sont encodés en UTF8 sans BOM (dans notepad++) , j'ai tenté diverses manip mais cela ne faisait rien.

En revanche, en plaçant la ligne que tu m'as préconisé :

Code : Tout sélectionner

header('Content-Type: text/html;charset=UTF-8');
Je suis parvenu à obtenir un résultat voulu, mais en revanche, ca m'a changé d'autres trucs dans la DB à savoir, si par exemple j'ai ce titre :
Green Velvet - Coïtus (Remix)
il sera écrit :
Green Velvet - Coïtus (Remix)
dans la DB.

Je ne sais pas si ça a une importance. Je dirais que dans l'absolu non vu que ca affiche comme je veux sur mes pages au final, mais je voudrais être sur que ce ne soit pas anormal.

Merki :)
Un Couin vaut mieux que Deux tu couineras :D
Retrouvez-moi tous les dimanches soir à 22H pour un mix live au vinyle sur eurodance90.fr :mrgreen:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

20 juil. 2017, 10:12

Vérifie que lors de la connexion à ta BDD en PHP tu as bien spécifié que le dialogue devait se faire en utf8 :
<?php
// Avec mysql_* (obsolète)
mysql_set_charset('utf8');

// Avec mysqli_*
mysqli_set_charset($link, 'utf8');
// ou
$mysqli->set_charset('utf8');

// Avec PDO :
$bdd = new PDO('mysql:host=localhost;dbname=nom_bdd;charset=utf8', 'root', '');
Quand tout le reste a échoué, lisez le mode d'emploi...