Problème de redirection

Par AswadSaadi, il y a 9 ans


Bonjour,

Mon but et de recuperer des informations sur un site par le biais d'un script dans le Shell de cakephp 3 que j'ai réaliser. Sur ce site il y a une premiere page avec une liste de tout les produits et pour chaque produit je vais sur sa page specifique pour avoir des informations plus precise.
Pour acceder a la page du produit, je passe par un lien avec son id et la le site distant (qui n'est pas de moi) effectue une redirection pour m'afficher le produit souhaite. Sauf que dans certains liens il y a des caracteres speciaux qui font tout planter et je ne sais pas comment y remedier..

Ce que je fais

Pour le moment je passe par une expression regulière qui regarde si dans le libelle du produit il n'y a pas de caractère spécial mais ça ne fonctionne pas.

if(!preg_match('ïs', $testLib)) { $this->out('non'); $fiche_produit = file_get_html('https://siteweb/'.$link); } else{ $this->out('oui'); $testLib = str_replace(' ', '-', $testLib); $this->out(htmlspecialchars_decode($testLib)); $fiche_produit = file_get_html(('https://siteweb/'.$testLib)); }

Ce que j'obtiens

Et donc avec cette redirection j'ai une erreur que voici.

10 réponses

Azorgh, il y a 9 ans

Hello,

Il semblerai que quelques URLs soient encodé.
Essai l'utilisation de la fonction urldecode(). (C'est une piste)

AswadSaadi, il y a 9 ans

Bonjour,

J'ai essayé avec ta methode mais ça ne fonctionne pas. Du coup j'ai essayé de passer par un getheaders() pour avoir l'URL de redirection et y aller mais j'ai toujours la même erreur d'encodage

Azorgh, il y a 9 ans

J'ai tenté un URL decode pour voir ce que donne :

ba%C3%AF%C2%8Fa-e (qui sort une erreur dans ton code).

En faisant donc :

echo urldecode('ba%C3%AF%C2%8Fa-e');

J'obtiens baïa-e. C'est bien ce résultat que tu devrais avoir en URL ?
Si oui, il faut exécuter la fonction urldecode() avant le file_get_contents (ou faire file_get_contents(urldecode($monurl)) )

AswadSaadi, il y a 9 ans

J'ai essayé avec urldecode mais il me donne une autre erreur

$fiche_produit = file_get_html((urldecode($testLib)));

Huggy, il y a 9 ans

Bonjour,
Pour nettoyer tes urls, tu peux regarder aussi du côté de la classe Transliterator

<?php $tr = Transliterator::create("Latin-ASCII"); $result = $tr->transliterate("hôpital/Charité.html"); // utf-8 -> ASCII //hopital/Charite.html" echo $result; ?>
AswadSaadi, il y a 9 ans

Bonjour @Huggy

Ca ne fontionne pas car l'url que je cherche à atteindre contient justement des caractères spéciaux et je ne peux pas passer outre pour recuperer les informations necessaires

Huggy, il y a 9 ans

Oui je pensais à nettoyer en amont, lors de la création des liens dans la page

AswadSaadi, il y a 9 ans

J'ai essayer de passer par un petit bidouillage mais j'ai encore un souci, la condition if(!strcmp($libelle[$i], 'Ï')==0) ne passe pas

$link = ''; if(!strrpos($libelle, 'Ï')) { $link = 'https://lesite'.$node; } else { print_r('oui'); $avant = ""; $apres = ""; $j = 0; for ($i=0; $i < strlen($libelle) ; $i++) { if(!strcmp($libelle[$i], 'Ï')==0){ if ($libelle[$i] == ' ') { $avant .= '-'; } else{ $avant .= strtolower($libelle[$i]); $j = $i; } } else{ print_r($i); break; } } for ($var=$j+1; $var< strlen($libelle) ; $var++) { if($libelle[$var] != 'Ï'){ if ($libelle[$var] == ' ') { $apres .= '-'; } else{ $apres .= strtolower($libelle[$var]); } } } print_r('avant : '.$avant."/n". 'apres : '. $apres); $libelle = $avant.'%C3%AF%C2%8F'.$apres; $link = ('https://lesite/'.$libelle); }
AswadSaadi, il y a 9 ans

Quelqu'un?

Huggy, il y a 9 ans

Ton caractère I tréma est un caractère unicode (utf-8) sur 2 octets,
Php gère pas nativement Utf-8 mais propose un jeu de fonctions Mutli-Byte
il faut donc utiliser les fonctions mb_xxxx