ILIAS  Release_4_2_x_branch Revision 61807
 All Data Structures Namespaces Files Functions Variables Groups Pages
PercentEncoder.php
Go to the documentation of this file.
1 <?php
2 
12 {
13 
17  protected $preserve = array();
18 
22  public function __construct($preserve = false) {
23  // unreserved letters, ought to const-ify
24  for ($i = 48; $i <= 57; $i++) $this->preserve[$i] = true; // digits
25  for ($i = 65; $i <= 90; $i++) $this->preserve[$i] = true; // upper-case
26  for ($i = 97; $i <= 122; $i++) $this->preserve[$i] = true; // lower-case
27  $this->preserve[45] = true; // Dash -
28  $this->preserve[46] = true; // Period .
29  $this->preserve[95] = true; // Underscore _
30  $this->preserve[126]= true; // Tilde ~
31 
32  // extra letters not to escape
33  if ($preserve !== false) {
34  for ($i = 0, $c = strlen($preserve); $i < $c; $i++) {
35  $this->preserve[ord($preserve[$i])] = true;
36  }
37  }
38  }
39 
50  public function encode($string) {
51  $ret = '';
52  for ($i = 0, $c = strlen($string); $i < $c; $i++) {
53  if ($string[$i] !== '%' && !isset($this->preserve[$int = ord($string[$i])]) ) {
54  $ret .= '%' . sprintf('%02X', $int);
55  } else {
56  $ret .= $string[$i];
57  }
58  }
59  return $ret;
60  }
61 
69  public function normalize($string) {
70  if ($string == '') return '';
71  $parts = explode('%', $string);
72  $ret = array_shift($parts);
73  foreach ($parts as $part) {
74  $length = strlen($part);
75  if ($length < 2) {
76  $ret .= '%25' . $part;
77  continue;
78  }
79  $encoding = substr($part, 0, 2);
80  $text = substr($part, 2);
81  if (!ctype_xdigit($encoding)) {
82  $ret .= '%25' . $part;
83  continue;
84  }
85  $int = hexdec($encoding);
86  if (isset($this->preserve[$int])) {
87  $ret .= chr($int) . $text;
88  continue;
89  }
90  $encoding = strtoupper($encoding);
91  $ret .= '%' . $encoding . $text;
92  }
93  return $ret;
94  }
95 
96 }
97 
98 // vim: et sw=4 sts=4