Я хочу заменить все символы в строке с их представлением кодировки процента (%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 -> +
Сегодня я много часов пытался найти правильную форму шаблона. И в начале это казалось очень простым … Я действительно ценю любой совет или решение.
Большое спасибо.
Самый простой способ — сначала декодировать предыдущие закодированные символы, а затем перекодировать всю строку.
$string = 'abc#%2Bdef';
$string = rawurlencode(rawurldecode($string));
Это даст вам ожидаемый результат.
abc%23%2Bdef
Других решений пока нет …