Teste si la chaîne est codée en URL en PHP
Comment puis-je tester si une chaîne encodée URL?
Laquelle de ces approches est la mieux?
- De la recherche la chaîne de caractères codés, qui ne le sont pas, et s'il en existe, puis son pas codé, ou
- Utiliser quelque chose comme ce que j'ai fait:
function is_urlEncoded($string){
$test_string = $string;
while(urldecode($test_string) != $test_string){
$test_string = urldecode($test_string);
}
return (urlencode($test_string) == $string)?True:False;
}
$t = "Hello World > how are you?";
if(is_urlEncoded($sreq)){
print "Was Encoded.\n";
}else{
print "Not Encoded.\n";
print "Should be ".urlencode($sreq)."\n";
}
Le code ci-dessus fonctionne, mais pas dans les cas où la chaîne a été doublement codé, comme dans ces exemples:
$t = "Hello%2BWorld%2B%253E%2Bhow%2Bare%2Byou%253F";
$t = "Hello+World%2B%253E%2Bhow%2Bare%2Byou%253F";
source d'informationauteur Psytronic
Vous devez vous connecter pour publier un commentaire.
Vous ne serez jamais savoir avec certitude si une chaîne est codé URL ou si elle devait à la séquence de
%2B
. Au lieu de cela, il a probablement dépend de l'endroit où la chaîne est venu, c'est à dire si elle a été fabriqués à la main ou à partir de certaines applications.Je pense que c'est une meilleure approche, car il faudrait prendre soin des choses qui ont été faites par programme (en supposant que l'application n'aurait pas laissé un non-caractère codé derrière).
Seule chose qui va être source de confusion ici... Techniquement, le
%
"doit être" codé si il sera présent dans la valeur finale, puisque c'est un caractère spécial. Vous pourriez avoir à combiner vos approches de chercher devraient-être les caractères encodés ainsi que la validation des que la chaîne décode correctement si aucun n'est trouvé.j'ai un truc :
vous pouvez faire pour empêcher doublement de l'encodage.
Chaque fois d'abord décoder puis de nouveau encoder;
Puis faire de nouveau
L'exécution de cette manière, nous pouvons éviter la double coder 🙂
Ici est quelque chose que je viens de mettre ensemble.
Je pense qu'il n'y a pas de moyen infaillible de le faire. Par exemple, considérez les points suivants:
Est qu'une URL encodée Un "B" ou est-il besoin d'être codé pour "UN%2BB"?
bien, le terme "url codée" est un peu vague, peut-être simple regex pour vérifier fera l'affaire
Il n'y a aucun moyen fiable de le faire, car il y a des chaînes qui reste le même à travers le processus d'encodage, c'est à dire "abc" codé ou pas? Il n'y a pas de réponse claire. Aussi, comme vous l'avez rencontré, certains personnages ont de multiples encodages... Mais...
Votre decode-check-encoder-vérifier le régime échoue en raison du fait que certains caractères peuvent être codés à plus d'un titre. Toutefois, une légère modification à votre fonction doit être assez fiable, il suffit de vérifier si le décoder modifie la chaîne, si elle le fait, il a été encodé.
Il ne sera pas infaillible bien sûr, en tant que "10+20=30" renvoie true (+ convertie à l'espace), mais en fait, on a juste à faire de l'arithmétique. Je suppose que c'est ce que vous êtes en régime est de tenter une contre, je suis désolé de dire que je ne pense pas qu'il y a une solution parfaite.
HTH.
Edit:
Comme je l'ai entioned dans mon propre commentaire (juste rappeler ici pour plus de clarté), un bon compromis serait probablement à vérifier pour les caractères non valides dans votre url (par exemple, un espace), et si il y a certains, il n'est pas codé. Si il n'en existe pas, essayez de décoder et de voir si les changements de chaînes. Ce ne parvenez toujours pas à gérer l'arithmétique ci-dessus (ce qui est impossible), mais nous espérons qu'il sera suffisant.
Ce sujet:
Ne fonctionnera pas avec le double encodage, mais c'est hors de portée de toute façon, je suppose?
@user187291 code fonctionne et échoue seulement lorsque + n'est pas codé.
Je sais que c'est très vieux post. Mais cela a bien fonctionné pour moi.
envoyer une variable qui signale le décoder, quand on a déjà obtenir des données à partir d'une url.
Je suis en utilisant le test suivant pour voir si les chaînes ont été urlencoded:
Si une chaîne a déjà été urlencoded, les seuls caractères qui seront modifiés en double encodage % (qui commence tous encodés chaînes de caractères) et + (qui remplace les espaces.) Revenir et vous devriez avoir de la chaîne d'origine.
Laissez-moi savoir si cela fonctionne pour vous.
private static boolean isEncodedText(Chaîne de valeur, Chaîne de... l'encodage) throws UnsupportedEncodingException
{
Chaîne decodedText = URLDecoder.décoder(val, TransformFetchConstants.DEFAULT_CHARSET);