(Де)Кодирование url-строки. (PHP)

DavyJohnes
На сайте с 05.01.2011
Offline
84
4706

Доброго времени суток!

Ситуация такая:

Имеется строка: "привет".

Имеется всем известная php функция urldecode()/urlencode().

Если в качестве параметра функции urldecode() передается строка, которая заранее обработана функцией urlencode() (в виде:%D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82), то в результате будет (очевидно) исходная строка("привет").

Однако если на вход подать строку которая до этого не была обработана urlencode() ("привет"), то в результате получается кракозябра.

Так вот, если дабы избежать получения кракозябр, имеется ли способ проверять строку (в каком виде она находится, в исходном или уже обработанная urlencode() ) перед передачей её на обработку функции urlencode() ?

https://handy-tools.io (https://handy-tools.io) - Набор полезных утилит для всех!
C
На сайте с 20.05.2011
Offline
14
#1

более правильнее будет просто пересмотреть алгоритм, и на urldecode отдавать только те данные, которые идут в соотв формате, но в целом, можно как-то так:


<?php
$raw = 'строка кириллицей';
$enc = urlencode($raw);

$input = $raw;

if (preg_match('#[^a-z0-9%\+]#i', $input)) {
printf("%s is not in RFC 1738 url encoding format\n", $input);
} else {
printf("%s is in RFC 1738 url encoding format. Its decoded value: %s \n", $input, urldecode($input));
}

?>

здесь, $input = $raw - для ервого теста, и $input = $enc; для второго.

Но это притянутое за уши решение, более правильнее - пересмотреть свой алгоритм, если это возможно разумеется.

[umka]
На сайте с 25.05.2008
Offline
456
#2

Как-то так :)

if (preg_match('/^(%[A-Fa-f0-9]{2})+$/',$string)) {

$string=urldecode($string);

}

Лог в помощь!
SI
На сайте с 03.12.2007
Offline
130
#3
DavyJohnes:
Однако если на вход подать строку которая до этого не была обработана urlencode() ("привет"), то в результате получается кракозябра.

Можно пример?

urldecode() - обычный "беспроцентный" текст, и так не должна менять. Скорее дело в кодировках.

-= Онлайн сервисы =-

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий