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..
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));
}
Et donc avec cette redirection j'ai une erreur que voici.
Hello,
Il semblerai que quelques URLs soient encodé.
Essai l'utilisation de la fonction urldecode(). (C'est une piste)
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
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))
)
J'ai essayé avec urldecode mais il me donne une autre erreur
$fiche_produit = file_get_html((urldecode($testLib)));
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;
?>
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
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);
}
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