Comparer 2 chaînes de caractères :

Une moulinette de code qui s'est enrayée, une requête SQL qui ne passe pas ?
ph.gras
Addict
Addict
 
Messages: 71
Inscription: 23 Juin 2013, 13:39

Comparer 2 chaînes de caractères :

Messagede ph.gras » 20 Oct 2015, 15:56

Dans mon parseur, je cherche à discriminer les items qui ont déjà été insérés dans la base.

J'effectue une discrimination sur les titres, avec un premier tableau avec les titres du blog :
http://www.boblennon.fr

… et un second tableau avec les titres des items. Bizarrement, j'ai des doublons dont je ne
comprends pas l'origine. 2 exemples :
Code: Tout sélectionner
var_dump($blog_titles) :
[4]=> string(59) "DU METAL EN OR !!! MAD MAX : FURY BOB Ep.18 avec Bob Lennon"
var_dump($feed_titles) :
[20]=> string(60) "DU METAL EN OR !!! MAD MAX : FURY BOB Ep.18 avec Bob Lennon"


De façon apparemment aléatoire, il existe un caractère supplémentaire dans les titres du
flux RSS. Quand je copie la chaîne dans un traitement de texte et compte les caractères,
le caractère supplémentaire n'est pas compté… Dans un fichier texte, les 2 chaînes sont
identiques. Quand je fais un trim, ça ne change rien au problème !

Avatar de l’utilisateur
Galdon
Administrateur du site
Administrateur du site
 
Messages: 2180
Inscription: 06 Sep 2008, 22:05

Re: Comparer 2 chaînes de caractères :

Messagede Galdon » 25 Oct 2015, 00:48

Essaie de faire ça et poste le résultat ici :
Code: Tout sélectionner
var_dump((string) $feed_titles);
var_dump(bin2hex($feed_titles));
var_dump(bin2hex((string) $feed_titles));
"Si tu veux me parler, envoie-moi un... FAX !" - George Abitbol

ph.gras
Addict
Addict
 
Messages: 71
Inscription: 23 Juin 2013, 13:39

Re: Comparer 2 chaînes de caractères :

Messagede ph.gras » 27 Oct 2015, 20:47

Le résultat sur un site de test, pas sur le blog :
Code: Tout sélectionner
(string)$feed_titles:
string(5) "Array"
bin2hex($feed_titles):
NULL
bin2hex((string)$feed_titles):
string(10) "4172726179"


… mais je peux demander à ce que le test soit fait aussi sur le blog ;-)

ph.gras
Addict
Addict
 
Messages: 71
Inscription: 23 Juin 2013, 13:39

Re: Comparer 2 chaînes de caractères :

Messagede ph.gras » 27 Oct 2015, 20:55

Je pense que c'est ça que tu voulais, en fait :
Code: Tout sélectionner
$feed_titles:
array(30) { [0]=> string(77) "SKILL2WIN, LA MAJ !!! - Fanta et Bob sur le FantaBobWorld : Serveur Mini-Jeux" [1]=> string(80) "CRUSOE 3 - Ep.10 : Record du monde de Papotage ! ! - Fanta et Bob dans Minecraft" [2]=> string(67) "CRUSOE 3 - Ep.11 : Amis pour la vie ! - Fanta et Bob dans Minecraft" [3]=> string(49) "BEST OF : Fanta et Bob - LE ZAPPING DE SEPTEMBRE" [4]=> string(63) "CRUSOE 3 - Ep.12 : PokéCrusoé ! - Fanta et Bob dans Minecraft" [5]=> string(64) "CRUSOE 3 - Ep.13 : Note tes amis ! - Fanta et Bob dans Minecraft" [6]=> string(70) "CRUSOE 3 - Ep.14 : Plongée en aveugle ! - Fanta et Bob dans Minecraft" [7]=> string(88) "Minecraft Story Mode - Ep.1 : Cochon grillé ! - Let's Play avec TheFantasio974 PC HD FR" [8]=> string(44) "BEST OF : Fanta et Bob - LE ZAPPING : Ep.11" [9]=> string(83) "Minecraft Story Mode - Ep.2 : L'Arnaque ! - Let's Play avec TheFantasio974 PC HD FR" [10]=> string(57) "Fanta et Bob dans The Forest - Ep. 6 : LOST - Coop Survie" [11]=> string(92) "Minecraft Story Mode - Ep.3 : L'antre du sorcier ! - Let's Play avec TheFantasio974 PC HD FR" [12]=> string(59) "Hearthstone : NERF GRIM PATRON - Détente avec Fanta et Bob" [13]=> string(72) "The Witcher 3 : Bob Lennon - Ep.46 : UN COUTEAU POURRI +50% CRITIQUE !!!" [14]=> string(86) "Minecraft Story Mode - Ep.4 : L'Apocalypse ! - Let's Play avec TheFantasio974 PC HD FR" [15]=> string(63) "Fanta et Bob dans The Forest - Ep. 7 : La Mutante - Coop Survie" [16]=> string(68) "Fanta et Bob dans The Forest - Ep. 8 : Village'Ception - Coop Survie" [17]=> string(90) "Minecraft Story Mode - Ep.5 : Order of the Stone - Let's Play avec TheFantasio974 PC HD FR" [18]=> string(64) "FLAMME ET TONNERRE !!! MAD MAX : FURY BOB Ep.19 avec Bob Lennon" [19]=> string(65) "THE QUEST - FIN : ENFIN !!! XD - Fanta et Bob Minecraft Adventure" [20]=> string(58) "The Witcher 3 : Bob Lennon - Ep.47 : UN AMI DANS LE BESOIN" [21]=> string(71) "JOTUN - Ep.5 : La déesse EDF ! - Gameplay avec TheFantasio974 PC HD FR" [22]=> string(61) "Fanta et Bob dans The Forest - Ep. 9 : Cockpit - Coop Survie" [23]=> string(71) "L'ETRANGE NOËL DE Mr.MAX !!! MAD MAX : FURY BOB Ep.20 avec Bob Lennon" [24]=> string(66) "Fanta et Bob - Ep.5 : FANTAFAIT L'TAF !!! - COOP sur Rocket League" [25]=> string(74) "Fanta et Bob dans The Forest - Ep. 10 : Bienvenue au Camping - Coop Survie" [26]=> string(63) "CRUSOE 3 - Ep.15 : Seconde zone ! - Fanta et Bob dans Minecraft" [27]=> string(64) "JOTUN - Ep.6 : INFERNO ! - Gameplay avec TheFantasio974 PC HD FR" [28]=> string(66) "The Witcher 3 : Bob Lennon - Ep.48 : UN PAPILLON EN QUETE DE TRISS" [29]=> string(63) "LA COURSE DU GWAK !!! MAD MAX : FURY BOB Ep.21 avec Bob Lennon" }
bin2hex($feed_titles):
array(30) { [0]=> string(154) "534b494c4c3257494e2c204c41204d414a20212121202d2046616e746120657420426f6220737572206c652046616e7461426f62576f726c64203a2053657276657572204d696e692d4a657578" [1]=> string(160) "435255534f452033202d2045702e3130203a205265636f7264206475206d6f6e6465206465205061706f7461676520212021202d2046616e746120657420426f622064616e73204d696e656372616674" [2]=> string(134) "435255534f452033202d2045702e3131203a20416d697320706f7572206c61207669652021202d2046616e746120657420426f622064616e73204d696e656372616674" [3]=> string(98) "42455354204f46203a2046616e746120657420426f62202d204c4520205a415050494e472044452053455054454d425245" [4]=> string(126) "435255534f452033202d2045702e3132203a20506f6bc3a9437275736fc3a92021202d2046616e746120657420426f622064616e73204d696e656372616674" [5]=> string(128) "435255534f452033202d2045702e3133203a204e6f74652074657320616d69732021202d2046616e746120657420426f622064616e73204d696e656372616674" [6]=> string(140) "435255534f452033202d2045702e3134203a20506c6f6e67c3a96520656e2061766575676c652021202d2046616e746120657420426f622064616e73204d696e656372616674" [7]=> string(176) "4d696e6563726166742053746f7279204d6f6465202d2045702e31203a20436f63686f6e206772696c6cc3a92021202d204c6574277320506c617920617665632054686546616e746173696f393734205043204844204652" [8]=> string(88) "42455354204f46203a2046616e746120657420426f62202d204c4520205a415050494e47203a2045702e3131" [9]=> string(166) "4d696e6563726166742053746f7279204d6f6465202d2045702e32203a204c2741726e617175652021202d204c6574277320506c617920617665632054686546616e746173696f393734205043204844204652" [10]=> string(114) "46616e746120657420426f622064616e732054686520466f72657374202d2045702e2036203a204c4f5354202d20436f6f7020537572766965" [11]=> string(184) "4d696e6563726166742053746f7279204d6f6465202d2045702e33203a204c27616e74726520647520736f72636965722021202d204c6574277320506c617920617665632054686546616e746173696f393734205043204844204652" [12]=> string(118) "48656172746873746f6e65203a204e455246204752494d20504154524f4e202d2044c3a974656e746520617665632046616e746120657420426f62" [13]=> string(144) "54686520576974636865722033203a20426f62204c656e6e6f6e202d2045702e3436203a20554e20434f555445415520504f55525249202b35302520435249544951554520212121" [14]=> string(172) "4d696e6563726166742053746f7279204d6f6465202d2045702e34203a204c2741706f63616c797073652021202d204c6574277320506c617920617665632054686546616e746173696f393734205043204844204652" [15]=> string(126) "46616e746120657420426f622064616e732054686520466f72657374202d2045702e2037203a204c61204d7574616e7465202d20436f6f7020537572766965" [16]=> string(136) "46616e746120657420426f622064616e732054686520466f72657374202d2045702e2038203a2056696c6c6167652743657074696f6e202d20436f6f7020537572766965" [17]=> string(180) "4d696e6563726166742053746f7279204d6f6465202d2045702e35203a204f72646572206f66207468652053746f6e65202d204c6574277320506c617920617665632054686546616e746173696f393734205043204844204652" [18]=> string(128) "464c414d4d4520455420544f4e4e4552524520212121204d4144204d4158203a204655525920424f42202045702e3139206176656320426f62204c656e6e6f6e" [19]=> string(130) "544845205155455354202d2046494e203a20454e46494e20212121205844202d2046616e746120657420426f62204d696e65637261667420416476656e74757265" [20]=> string(116) "54686520576974636865722033203a20426f62204c656e6e6f6e202d2045702e3437203a20554e20414d492044414e53204c45204245534f494e" [21]=> string(142) "4a4f54554e202d2045702e35203a204c612064c3a965737365204544462021202d2047616d65706c617920617665632054686546616e746173696f393734205043204844204652" [22]=> string(122) "46616e746120657420426f622064616e732054686520466f72657374202d2045702e2039203a20436f636b70697420202d20436f6f7020537572766965" [23]=> string(142) "4c27455452414e4745204e4fc38b4c204445204d722e4d415820212121204d4144204d4158203a204655525920424f42202045702e3230206176656320426f62204c656e6e6f6e" [24]=> string(132) "46616e746120657420426f62202d2045702e35203a2046414e544146414954204c2754414620212121202d20434f4f502073757220526f636b6574204c6561677565" [25]=> string(148) "46616e746120657420426f622064616e732054686520466f72657374202d2045702e203130203a204269656e76656e75652061752043616d70696e67202d20436f6f7020537572766965" [26]=> string(126) "435255534f452033202d2045702e3135203a205365636f6e6465207a6f6e652021202d2046616e746120657420426f622064616e73204d696e656372616674" [27]=> string(128) "4a4f54554e202d2045702e36203a20494e4645524e4f2021202d2047616d65706c617920617665632054686546616e746173696f393734205043204844204652" [28]=> string(132) "54686520576974636865722033203a20426f62204c656e6e6f6e202d2045702e3438203a20554e20504150494c4c4f4e20454e205155455445204445205452495353" [29]=> string(126) "4c4120434f55525345204455204757414b20212121204d4144204d4158203a204655525920424f42202045702e3231206176656320426f62204c656e6e6f6e" }
bin2hex((string)$feed_titles):
array(30) { [0]=> string(154) "534b494c4c3257494e2c204c41204d414a20212121202d2046616e746120657420426f6220737572206c652046616e7461426f62576f726c64203a2053657276657572204d696e692d4a657578" [1]=> string(160) "435255534f452033202d2045702e3130203a205265636f7264206475206d6f6e6465206465205061706f7461676520212021202d2046616e746120657420426f622064616e73204d696e656372616674" [2]=> string(134) "435255534f452033202d2045702e3131203a20416d697320706f7572206c61207669652021202d2046616e746120657420426f622064616e73204d696e656372616674" [3]=> string(98) "42455354204f46203a2046616e746120657420426f62202d204c4520205a415050494e472044452053455054454d425245" [4]=> string(126) "435255534f452033202d2045702e3132203a20506f6bc3a9437275736fc3a92021202d2046616e746120657420426f622064616e73204d696e656372616674" [5]=> string(128) "435255534f452033202d2045702e3133203a204e6f74652074657320616d69732021202d2046616e746120657420426f622064616e73204d696e656372616674" [6]=> string(140) "435255534f452033202d2045702e3134203a20506c6f6e67c3a96520656e2061766575676c652021202d2046616e746120657420426f622064616e73204d696e656372616674" [7]=> string(176) "4d696e6563726166742053746f7279204d6f6465202d2045702e31203a20436f63686f6e206772696c6cc3a92021202d204c6574277320506c617920617665632054686546616e746173696f393734205043204844204652" [8]=> string(88) "42455354204f46203a2046616e746120657420426f62202d204c4520205a415050494e47203a2045702e3131" [9]=> string(166) "4d696e6563726166742053746f7279204d6f6465202d2045702e32203a204c2741726e617175652021202d204c6574277320506c617920617665632054686546616e746173696f393734205043204844204652" [10]=> string(114) "46616e746120657420426f622064616e732054686520466f72657374202d2045702e2036203a204c4f5354202d20436f6f7020537572766965" [11]=> string(184) "4d696e6563726166742053746f7279204d6f6465202d2045702e33203a204c27616e74726520647520736f72636965722021202d204c6574277320506c617920617665632054686546616e746173696f393734205043204844204652" [12]=> string(118) "48656172746873746f6e65203a204e455246204752494d20504154524f4e202d2044c3a974656e746520617665632046616e746120657420426f62" [13]=> string(144) "54686520576974636865722033203a20426f62204c656e6e6f6e202d2045702e3436203a20554e20434f555445415520504f55525249202b35302520435249544951554520212121" [14]=> string(172) "4d696e6563726166742053746f7279204d6f6465202d2045702e34203a204c2741706f63616c797073652021202d204c6574277320506c617920617665632054686546616e746173696f393734205043204844204652" [15]=> string(126) "46616e746120657420426f622064616e732054686520466f72657374202d2045702e2037203a204c61204d7574616e7465202d20436f6f7020537572766965" [16]=> string(136) "46616e746120657420426f622064616e732054686520466f72657374202d2045702e2038203a2056696c6c6167652743657074696f6e202d20436f6f7020537572766965" [17]=> string(180) "4d696e6563726166742053746f7279204d6f6465202d2045702e35203a204f72646572206f66207468652053746f6e65202d204c6574277320506c617920617665632054686546616e746173696f393734205043204844204652" [18]=> string(128) "464c414d4d4520455420544f4e4e4552524520212121204d4144204d4158203a204655525920424f42202045702e3139206176656320426f62204c656e6e6f6e" [19]=> string(130) "544845205155455354202d2046494e203a20454e46494e20212121205844202d2046616e746120657420426f62204d696e65637261667420416476656e74757265" [20]=> string(116) "54686520576974636865722033203a20426f62204c656e6e6f6e202d2045702e3437203a20554e20414d492044414e53204c45204245534f494e" [21]=> string(142) "4a4f54554e202d2045702e35203a204c612064c3a965737365204544462021202d2047616d65706c617920617665632054686546616e746173696f393734205043204844204652" [22]=> string(122) "46616e746120657420426f622064616e732054686520466f72657374202d2045702e2039203a20436f636b70697420202d20436f6f7020537572766965" [23]=> string(142) "4c27455452414e4745204e4fc38b4c204445204d722e4d415820212121204d4144204d4158203a204655525920424f42202045702e3230206176656320426f62204c656e6e6f6e" [24]=> string(132) "46616e746120657420426f62202d2045702e35203a2046414e544146414954204c2754414620212121202d20434f4f502073757220526f636b6574204c6561677565" [25]=> string(148) "46616e746120657420426f622064616e732054686520466f72657374202d2045702e203130203a204269656e76656e75652061752043616d70696e67202d20436f6f7020537572766965" [26]=> string(126) "435255534f452033202d2045702e3135203a205365636f6e6465207a6f6e652021202d2046616e746120657420426f622064616e73204d696e656372616674" [27]=> string(128) "4a4f54554e202d2045702e36203a20494e4645524e4f2021202d2047616d65706c617920617665632054686546616e746173696f393734205043204844204652" [28]=> string(132) "54686520576974636865722033203a20426f62204c656e6e6f6e202d2045702e3438203a20554e20504150494c4c4f4e20454e205155455445204445205452495353" [29]=> string(126) "4c4120434f55525345204455204757414b20212121204d4144204d4158203a204655525920424f42202045702e3231206176656320426f62204c656e6e6f6e" }

Avatar de l’utilisateur
Galdon
Administrateur du site
Administrateur du site
 
Messages: 2180
Inscription: 06 Sep 2008, 22:05

Re: Comparer 2 chaînes de caractères :

Messagede Galdon » 28 Oct 2015, 21:48

Je prend l'exemple de cette valeur :
Code: Tout sélectionner
$feed_titles:
[29]=> string(63) "LA COURSE DU GWAK !!! MAD MAX : FURY BOB Ep.21 avec Bob Lennon"

bin2hex($feed_titles):
[29]=> string(126) "4c4120434f55525345204455204757414b20212121204d4144204d4158203a204655525920424f42202045702e3231206176656320426f62204c656e6e6f6e"


La longueur indiquée par var_dump est 63 octets, alors que la chaîne "LA COURSE DU GWAK !!! MAD MAX : FURY BOB Ep.21 avec Bob Lennon" ne contient que 62 caractères ASCII, donc sa longueur devrait être de 63.

Sauf qu'en lisant regardant le dump de la chaîne de caractère en hexa (4c4120434f55525345204455204757414b20212121204d4144204d4158203a204655525920424f42202045702e3231206176656320426f62204c656e6e6f6e), je vois qu'en fait la chaîne ne fait pas 62 mais 63 caractères, voilà le vrai contenu de la variable :
Code: Tout sélectionner
string(63) "LA COURSE DU GWAK !!! MAD MAX : FURY BOB  Ep.21 avec Bob Lennon"


Ça n’apparaît pas dans ton var_dump car il est affiché dans une page web par ton navigateur, et en HTML les espaces consécutifs sont traités comme un seul espace.
Mais du coup ça explique pourquoi il y a des doublons. En réalité il ne s'agit pas de doublon puisque les valeurs sont différentes.
"Si tu veux me parler, envoie-moi un... FAX !" - George Abitbol

ph.gras
Addict
Addict
 
Messages: 71
Inscription: 23 Juin 2013, 13:39

Re: Comparer 2 chaînes de caractères :

Messagede ph.gras » 29 Oct 2015, 20:44

Galdon a écrit:Ça n’apparaît pas dans ton var_dump car il est affiché dans une page web par ton navigateur, et en HTML les espaces consécutifs sont traités comme un seul espace.
Mais du coup ça explique pourquoi il y a des doublons. En réalité il ne s'agit pas de doublon puisque les valeurs sont différentes.

Okaaaaaaaaaaay ! Donc, chaque fois qu'on copie-colle une chaîne de caractères, on risque
de se retrouver avec une comparaison qui ne fonctionne pas correctement. Pas glop :( !

Peux-tu m'expliquer un peu comment ça marche, bin2hex s'il te plaît ? Je n'ai pas vraiment
compris, je vois juste que 63 x 2 = 126.

Avatar de l’utilisateur
Galdon
Administrateur du site
Administrateur du site
 
Messages: 2180
Inscription: 06 Sep 2008, 22:05

Re: Comparer 2 chaînes de caractères :

Messagede Galdon » 30 Oct 2015, 19:32

En php, les chaînes de caractères sont stockées sous forme binaire, c'est-à-dire une suite d'octets.

Quand j'ai vu la différence de longueur indiquée dans les résultats de var_dump dans ton premier message, j'ai soupçonné que le caractère en plus était un caractère spécial, qui n'apparaît pas dans la valeur telle qu'elle est affichée dans le navigateur.

Donc, pour vérifier, il faut récupérer le contenu brut de la chaîne au lieu de son "rendu" (qui dépend du jeu de caractères (charset)), donc je t'ai demandé de me donner le résultat de bin2hex, fonction qui sert à afficher le contenu brut de la chaîne de caractères, sous forme hexadécimale.

J'aurais très bien pu te demander d'utiliser base64_encode à la place de bin2hex, en fait l'idée c'est juste d'éviter les problèmes liés au charset ou aux caractères spéciaux, je voulais juste avoir la valeur exacte de la variable telle qu'elle est dans la mémoire.
"Si tu veux me parler, envoie-moi un... FAX !" - George Abitbol

ph.gras
Addict
Addict
 
Messages: 71
Inscription: 23 Juin 2013, 13:39

Re: Comparer 2 chaînes de caractères :

Messagede ph.gras » 31 Oct 2015, 17:02

OK, je comprends mieux merci. Par contre, je pensais que le hexadécimal c'était un truc en base 6.

Dans ce cas, ne devrait-on pas obtenir une représentation de chaque octet en 6 caractères ?

Par exemple, les couleurs on les a de #000000 à #FFFFFF.

Sinon, j'ai résolu le problème ainsi :
Code: Tout sélectionner
str_replace('  ', ' ', $blog_titles[$key]->title);    // remplace 2 caractères blancs consécutifs par 1 caractère blanc.
str_replace('  ', ' ', $feed_titles[$key]->title);

$array = array_diff($feed_titles, $blog_titles);


Mais avant ça, j'ai remplacé tous les caractères blancs par un point de ponctuation, et là j'ai observé
en effet comment le gars construisait ses titres… peut-être même automatiquement pour poster des
vidéos sur YT. De fait, il existe plein d'espaces doubles entre sous-chaînes caractéristiques :-) .

Avatar de l’utilisateur
Galdon
Administrateur du site
Administrateur du site
 
Messages: 2180
Inscription: 06 Sep 2008, 22:05

Re: Comparer 2 chaînes de caractères :

Messagede Galdon » 02 Nov 2015, 19:40

ph.gras a écrit:OK, je comprends mieux merci. Par contre, je pensais que le hexadécimal c'était un truc en base 6.
Dans ce cas, ne devrait-on pas obtenir une représentation de chaque octet en 6 caractères ?


Non, l'hexa est un système de numérotation en base 16, et chaque octet correspond à 2 caractères hexadécimaux.
"Si tu veux me parler, envoie-moi un... FAX !" - George Abitbol

ph.gras
Addict
Addict
 
Messages: 71
Inscription: 23 Juin 2013, 13:39

Re: Comparer 2 chaînes de caractères :

Messagede ph.gras » 04 Nov 2015, 16:45

Galdon a écrit:Non, l'hexa est un système de numérotation en base 16, et chaque octet correspond à 2 caractères hexadécimaux.

OK : 8 x 2 ;-) Merci, patron !


Retourner vers PHP/MySQL

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités