Кодировать символы, если они еще не закодированы (с помощью rawurlencode и preg_replace_callback)

Я хочу заменить все символы в строке с их представлением кодировки процента (%xy), но только те, которые еще не закодированы в процентах.

Например, в строке abc#%2Bdef, %2B часть уже представляет собой закодированное в процентах представление. Так что это не должно быть перекодировано. Правильный результат после кодирования должен быть: abc%23%2Bdef.

Это то, что я пытался — но результат все еще abc#%2Bdef:

// Pattern: read all characters except the percent-encoded ones (%xy).
$pattern = '/(?!%[a-fA-F0-9]{2})/';
$string = 'abc#%2Bdef';

$result = preg_replace_callback($pattern, function($matches) {
return rawurlencode($matches[0]);
}, $string);

var_dump($result);

Я думаю, что это просто $patternзначение, которое должно быть изменено, но я не уверен. И с текущей моделью rawurlencode() внутри callback не вызывается.

Легенда кодирования: %23 -> #, %2B -> +

Сегодня я много часов пытался найти правильную форму шаблона. И в начале это казалось очень простым … Я действительно ценю любой совет или решение.

Большое спасибо.

1

Решение

Самый простой способ — сначала декодировать предыдущие закодированные символы, а затем перекодировать всю строку.

$string = 'abc#%2Bdef';
$string = rawurlencode(rawurldecode($string));

Это даст вам ожидаемый результат.

abc%23%2Bdef
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector