Caractères vraiment spéciaux dans l'url

WRInaute discret
Bonsoir, je cherche vainement comment transformer dans un url de ce type :

-http://monomdedomaine.com/index.php?articlenom=une%20histoire%20c’est%20bien&ecrivain=2
la chaine de caracteres ’ par -- par exemple.

Car je ne peux recuperer la variable $GET['ecrivain']; car ’ l'équivalent de l'apostrophe de WORD me bloque l'url.

En gros si j'affiche l'url dans une variable php j'aurais -http://monomdedomaine.com/index.php?articlenom=une%20histoire%20c& et pas le reste de l'url.

J'ai essayé str_replace, ereg, preg... et rien n'y fait je ne peux voir ma derniere variable $GET['ecrivain'] de l'url
Quelqu'un saurait merci ?
 
WRInaute accro
onlylove a dit:
Bonsoir, je cherche vainement comment transformer dans un url de ce type :

-http://monomdedomaine.com/index.php?articlenom=une%20histoire%20c’est%20bien&ecrivain=2
la chaine de caracteres ’ par -- par exemple.

Car je ne peux recuperer la variable $GET['ecrivain']; car ’ l'équivalent de l'apostrophe de WORD me bloque l'url.

En gros si j'affiche l'url dans une variable php j'aurais -http://monomdedomaine.com/index.php?articlenom=une%20histoire%20c& et pas le reste de l'url.

J'ai essayé str_replace, ereg, preg... et rien n'y fait je ne peux voir ma derniere variable $GET['ecrivain'] de l'url
Quelqu'un saurait merci ?

Ben le problème c'est que le & sépare les différents paramètres de ton URL, donc quand il tombe sur le premier & il considère, suivant l'implémentation, soit que la partie entre ce & et le & suivant est un paramètre sans valeur, soit que la partie entre ce & et le = suivant et le nom d'un paramètre. Il faut que tu encodes tes paramètres pour éviter ces caractères, avec urlencode par exemple.

Note qu'il est bizarre que tu aies quelque chose au format "&#8217", ça sent du contenu encodé en HTML (pour obtenir &#8217) puis réencodé (et le & est remplacé par &).

Jacques.
 
WRInaute discret
Oui merci j'avais testé urlencode et rawurlencode mais sans rien avoir de mieux

Url dans le navigateur = affichage du mot c'est = c’
Url sans url encode = c&
Url avec url encode = c%26amp%3B
et plus rien à la suite sachant que l'url complet est -http://monomdedomaine.com/index.php?articlenom=une%20histoire%20c’est%20bien&ecrivain=2
Mystère...
 
WRInaute passionné
Meme avis. Ou autrement dit: ton URL n'etant pas correcte, tu ne pourras jamais recuperer ton parametre.

(il faut decoder les entites puis encoder l'URL)
 
WRInaute passionné
c'est la construction de l'url qui n'est pas bonne. il faut faire un truc du genre :
Code:
$url = 'http://monomdedomaine.com/index.php?articlenom=' . urlencode('une histoire c'est bien') . '&ecrivain=2';
 
WRInaute accro
onlylove a dit:
Oui merci j'avais testé urlencode et rawurlencode mais sans rien avoir de mieux

Url dans le navigateur = affichage du mot c'est = c’
Url sans url encode = c&
Url avec url encode = c%26amp%3B
et plus rien à la suite sachant que l'url complet est -http://monomdedomaine.com/index.php?articlenom=une%20histoire%20c’est%20bien&ecrivain=2
Mystère...

On est bien d'accord que ces URLs, c'est toi qui les génères, à partir de je ne sais quoi (une base de données, je suppose)? Déjà, à quel format sont les valeurs de tes arguments à la base? Idéalement tu devrait utiliser de l'UTF-8, et donc ça devrait être "c'est". Ensuite tu composes ton URL:
"gnagna.net/truc?param1="+urlencode(valeur)+"&param2="+urlencode(valeur)

Note que ton URL placée ensuite dans un attribut HTML (a href=...) devrait ensuite être escapée au niveau HTML, i.e. le & devrait être remplacé par un &amp; (et les " et < et > aussi), sinon tu cours le risque que ce qui est derrière le & soit interprété comme une entité html.

Donc:

valeur initiale: c'est
URL préparée: gnagna.net/truc?param1=c%E2%80%99est&param2=cool
Source HTML: <A HREF="gnagna.net/truc?param1=c%E2%80%99&amp;param2=cool">

C'est plus clair comme ça?

Jacques.
 
WRInaute discret
Clair oui merci en fait, j'écris un article au préalable j'encode l'url de l'article : $articlenom=htmlspecialchars($articlenom);

index.php?articlenom=$articlenom&ecrivain=$valeur

Et lorsque je clique sur le lien de l'article hop l'url se transforme et je veux récupérer l'écrivain : la variable $ecrivain=2 ...
Il ne faut pas utiliser htmlspecialchars en fait peut-être.
 
WRInaute passionné
si il faut utiliser htmlspecialchars après avoir encodé l'url :
Code:
$url = 'http://monomdedomaine.com/index.php?articlenom=' . urlencode('une histoire c'est bien') . '&ecrivain=2';
$lien = '<a href="' . htmlspecialchars($url) . '">un lien</a>';
 
WRInaute discret
Ok d'accord je me trompais dans l'ordre.

Et puis-je plutôt ne pas encoder l'url comme ceci :

$articlenom="une histoire c'est bien";
-http://monomdedomaine.com/index.php?articlenom=$articlenom&ecrivain=2

et ensuite faire ceci : $lien = '<a href="index.php?articlenom' . htmlspecialchars($articlenom) . '&ecrivain=$valeur">un lien</a>';
ou ca buggerra (si je veux récupérer $ecrivain) car url pas encodé ? ou c'est bon ?
 
WRInaute accro
onlylove a dit:
Ok d'accord je me trompais dans l'ordre.

En effet.

onlylove a dit:
Et puis-je plutôt ne pas encoder l'url comme ceci :
$articlenom="une histoire c'est bien";
-http://monomdedomaine.com/index.php?articlenom=$articlenom&ecrivain=2

et ensuite faire $lien = '<a href="' . htmlspecialchars($articlenom) . '">un lien</a>';
ou ca buggerra (si je veux récupérer $ecrivain) car url pas encodé ? ou c'est bon ?

Si tu n'utilises pas urlencode, tu auras un problème au moins avec:
- les espaces
- les &
- les +
- les %
- les #

Donc:
- urlencode pour la valeur de chaque paramètre
- htmlspecialchars pour l'ensemble de l'URL (si elle est dans un attribut d'un élément HTML).

Jacques.
 
WRInaute discret
Ah ok, c'est un peu compliqué mais j'ai compris.
A force de lire la doc de php et d'utiliser 50 fonctions je m'y perdais.
Donc urlencode et htmlspecialchars.
Merci à tous je vais tester ça.
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut