Test si la chaîne de caractères est encodée en PHP
Comment puis-je tester si une chaîne de caractères est encodée?
laquelle des approches suivantes est la meilleure?
- rechercher la chaîne de caractères pour les caractères qui seraient encodés, qui ne le sont pas, et si l'un existe alors son pas encodé, ou
- utilisez quelque chose comme ceci 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";
11 réponses
vous ne saurez jamais avec certitude si une chaîne de caractères est encodée par une URL ou si elle était supposée avoir la séquence %2B
. Au lieu de cela, cela dépend probablement de l'origine de la chaîne, c'est-à-dire si elle a été fabriquée à la main ou à partir d'une application quelconque.
Est-il préférable de rechercher la chaîne de caractères codés, qui ne le sont pas, et s'il en existe, puis son pas codé.
je pense que c'est une meilleure approche, car il faudrait prendre soin des choses qui ont a été fait par programmation (en supposant que l'application n'aurait pas laissé un caractère non codé derrière).
une chose qui sera déroutante ici... Techniquement, le %
"doit être" codé si il sera présent dans la valeur finale, puisque c'est un caractère spécial. Vous devrez peut-être combiner vos approches pour rechercher les caractères qui devraient être encodés et valider que la chaîne décode avec succès 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;
$string = urldecode($string);
Puis faire de nouveau
$string = urlencode($string);
effectuer de cette façon nous pouvons éviter le double encodage :)
voici quelque chose que je viens d'assembler.
if ( urlencode(urldecode($data)) === $data){
echo 'string urlencoded';
} else {
echo 'string is NOT urlencoded';
}
je pense qu'il n'y a pas de moyen infaillible de le faire. Par exemple, considérons l'exemple suivant:
$t = "A+B";
est-ce une URL encodée "A B" ou doit-elle être encodée à "A%2BB"?
Eh bien ,le terme "url encoded" est un peu vague, peut-être que la simple vérification regex fera l'affaire
$is_encoded = preg_match('~%[0-9A-F]{2}~i', $string);
il n'y a aucun moyen fiable de le faire, car il y a des chaînes qui restent les mêmes tout au long du processus d'encodage, c'est-à-dire que "abc" est encodé ou non? Il n'y a pas de réponse claire. En outre, comme vous l'avez rencontré, certains caractères ont des encodages multiples... 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. Cependant, une légère modification de votre fonction devrait être assez fiable, il suffit de vérifier si le décodage modifie la chaîne, si elle le fait, il a été encodé.
ce ne sera pas une preuve évidente, car "10+20=30" retournera vrai (+ se convertit à l'espace), mais en fait nous ne faisons que de l'arithmétique. Je suppose que c'est ce que votre plan tente de contrer, je suis désolé de dire qu'il n'y a pas de solution parfaite.
HTH.
Edit:
Comme je l'ai indiqué dans mon propre commentaire (je le répète ici pour plus de clarté), un bon compromis serait probablement vérifiez les caractères invalides dans votre url (par exemple l'espace), et s'il y en a, ce n'est pas encodé. S'il n'y en a pas, essayez de décoder et voyez si la chaîne change. Cela ne va toujours pas gérer l'arithmétique ci-dessus (ce qui est impossible), mais il est à espérer qu'il sera suffisant.
Ce sujet:
if (urldecode(trim($url)) == trim($url)) { $url_form = 'decoded'; }
else { $url_form = 'encoded'; }
ne fonctionne pas avec le double encodage, mais c'est hors de portée de toute façon, je suppose?
@user187291 le code fonctionne et n'échoue que lorsque + n'est pas encodé.
je sais que c'est très vieux post. Mais cela a bien fonctionné pour moi.
$is_encoded = preg_match('~%[0-9A-F]{2}~i', $string);
if($is_encoded) {
$string = urlencode(urldecode(str_replace(['+','='], ['%2B','%3D'], $string)));
} else {
$string = urlencode($string);
}
envoyer une variable qui signale le décodage lorsque vous obtenez déjà des données à partir d'une url.
?path=folder/new%20file.txt&decode=1
j'utilise le test suivant pour voir si les chaînes ont été urlencoded:
if(urlencode($str) != str_replace(['%','+'], ['%25','%2B'], $str))
si une chaîne de caractères a déjà été urlencodée, les seuls caractères qui seront modifiés par un double encodage sont % (qui démarre toutes les chaînes de caractères encodées) et + (qui remplace les espaces.) Changez - les en arrière et vous devriez avoir la chaîne originale.
Laissez-moi savoir si cela fonctionne pour vous.
privé booléen statique isEncodedText (String val, String... encoding) lance UnsupportedEncodingException { String decodedText = URLDecoder.décoder (val, TransformFetchConstants.DEFAULT_CHARSET);
if(encoding != null && encoding.length > 0){
decodedText = URLDecoder.decode(val, encoding[0]);
}
String encodedText = URLEncoder.encode(decodedText);
return encodedText.equalsIgnoreCase(val) || !decodedText.equalsIgnoreCase(val);
}