library/SimplePie/Net/IPv6.php Quellcode

IPv6.php
gehe zur Dokumentation dieser Datei
1 <?php
60 {
79  public static function uncompress($ip)
80  {
81  $c1 = -1;
82  $c2 = -1;
83  if (substr_count($ip, '::') === 1)
84  {
85  list($ip1, $ip2) = explode('::', $ip);
86  if ($ip1 === '')
87  {
88  $c1 = -1;
89  }
90  else
91  {
92  $c1 = substr_count($ip1, ':');
93  }
94  if ($ip2 === '')
95  {
96  $c2 = -1;
97  }
98  else
99  {
100  $c2 = substr_count($ip2, ':');
101  }
102  if (strpos($ip2, '.') !== false)
103  {
104  $c2++;
105  }
106  // ::
107  if ($c1 === -1 && $c2 === -1)
108  {
109  $ip = '0:0:0:0:0:0:0:0';
110  }
111  // ::xxx
112  else if ($c1 === -1)
113  {
114  $fill = str_repeat('0:', 7 - $c2);
115  $ip = str_replace('::', $fill, $ip);
116  }
117  // xxx::
118  else if ($c2 === -1)
119  {
120  $fill = str_repeat(':0', 7 - $c1);
121  $ip = str_replace('::', $fill, $ip);
122  }
123  // xxx::xxx
124  else
125  {
126  $fill = ':' . str_repeat('0:', 6 - $c2 - $c1);
127  $ip = str_replace('::', $fill, $ip);
128  }
129  }
130  return $ip;
131  }
132 
147  public static function compress($ip)
148  {
149  // Prepare the IP to be compressed
150  $ip = self::uncompress($ip);
151  $ip_parts = self::split_v6_v4($ip);
152 
153  // Replace all leading zeros
154  $ip_parts[0] = preg_replace('/(^|:)0+([0-9])/', '\1\2', $ip_parts[0]);
155 
156  // Find bunches of zeros
157  if (preg_match_all('/(?:^|:)(?:0(?::|$))+/', $ip_parts[0], $matches, PREG_OFFSET_CAPTURE))
158  {
159  $max = 0;
160  $pos = null;
161  foreach ($matches[0] as $match)
162  {
163  if (strlen($match[0]) > $max)
164  {
165  $max = strlen($match[0]);
166  $pos = $match[1];
167  }
168  }
169 
170  $ip_parts[0] = substr_replace($ip_parts[0], '::', $pos, $max);
171  }
172 
173  if ($ip_parts[1] !== '')
174  {
175  return implode(':', $ip_parts);
176  }
177  else
178  {
179  return $ip_parts[0];
180  }
181  }
182 
195  private static function split_v6_v4($ip)
196  {
197  if (strpos($ip, '.') !== false)
198  {
199  $pos = strrpos($ip, ':');
200  $ipv6_part = substr($ip, 0, $pos);
201  $ipv4_part = substr($ip, $pos + 1);
202  return array($ipv6_part, $ipv4_part);
203  }
204  else
205  {
206  return array($ip, '');
207  }
208  }
209 
218  public static function check_ipv6($ip)
219  {
220  $ip = self::uncompress($ip);
221  list($ipv6, $ipv4) = self::split_v6_v4($ip);
222  $ipv6 = explode(':', $ipv6);
223  $ipv4 = explode('.', $ipv4);
224  if (count($ipv6) === 8 && count($ipv4) === 1 || count($ipv6) === 6 && count($ipv4) === 4)
225  {
226  foreach ($ipv6 as $ipv6_part)
227  {
228  // The section can't be empty
229  if ($ipv6_part === '')
230  return false;
231 
232  // Nor can it be over four characters
233  if (strlen($ipv6_part) > 4)
234  return false;
235 
236  // Remove leading zeros (this is safe because of the above)
237  $ipv6_part = ltrim($ipv6_part, '0');
238  if ($ipv6_part === '')
239  $ipv6_part = '0';
240 
241  // Check the value is valid
242  $value = hexdec($ipv6_part);
243  if (dechex($value) !== strtolower($ipv6_part) || $value < 0 || $value > 0xFFFF)
244  return false;
245  }
246  if (count($ipv4) === 4)
247  {
248  foreach ($ipv4 as $ipv4_part)
249  {
250  $value = (int) $ipv4_part;
251  if ((string) $value !== $ipv4_part || $value < 0 || $value > 0xFF)
252  return false;
253  }
254  }
255  return true;
256  }
257  else
258  {
259  return false;
260  }
261  }
262 
272  public static function checkIPv6($ip)
273  {
274  return self::check_ipv6($ip);
275  }
276 }




Korrekturen, Hinweise und Ergänzungen

Bitte scheuen Sie sich nicht und melden Sie, was auf dieser Seite sachlich falsch oder irreführend ist, was ergänzt werden sollte, was fehlt usw. Dazu bitte oben aus dem Menü Seite den Eintrag Support Forum wählen. Es ist eine kostenlose Anmeldung erforderlich, um Anmerkungen zu posten. Unpassende Postings, Spam usw. werden kommentarlos entfernt.