Мне нравились @ user72740, пока я не обнаружил, что он все еще может генерировать символы, не разрешенные CI, такие как%.
В итоге я преобразовал строку сегмента в шестнадцатеричный код, а затем вернул их обратно.
Итак, я создал MY_URI, который расширил CI_URI и добавил следующие методы:
/**
* Segmentize
*
* Makes URI segments, CI "segment proof"
* Removes dots and forwardslash leaving ONLY hex characters
* Allows to pass "anything" as a CI URI segment and coresponding function param
*
* @access public
* @return string
*/
public function segmentize($segment){
if(empty($segment)){
return '';
}
return bin2hex($segment);
}
/**
* Desegmentize
*
* @access public
* @return string
*/
public function desegmentize($segment){
if(empty($segment)){
return '';
}
return $this->hex2bin($segment);
}
/**
* hex2bin
*
* PHP 5.3 version of 5.4 native hex2bin
*
* @access public
* @return string
*/
public function hex2bin($hex) {
$n = strlen($hex);
$bin = '';
$i = 0;
while($i < $n){
$a = substr($hex, $i, 2);
$c = pack('H*', $a);
if ($i == 0){
$bin = $c;
}
else {
$bin .= $c;
}
$i += 2;
}
return $bin;
}
Затем использовал $this->uri->segmentize($url)
для создания строки сегмента и $this->uri->desegmentize($this->input->post('url', true))
, чтобы вернуть ее в читаемый формат.
Таким образом
https://www.example.com/somewhere/over/the/rainbow
становится
68747470733a2f2f7777772e6d79736974652e636f6d2f736f6d6577686572652f6f7665722f7468652f7261696e626f77
и обратно.
Я уверен, что естьлучше, как реализация base_convert (), потому что таким образом строка может быть произвольно длинной.Но теперь мне не нужно беспокоиться о знаках, отступах и т. Д.