Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

Mbstring.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 20.97 KiB


001  <?php
002   
003  /*
004   * This file is part of the Symfony package.
005   *
006   * (c) Fabien Potencier <fabien@symfony.com>
007   *
008   * For the full copyright and license information, please view the LICENSE
009   * file that was distributed with this source code.
010   */
011   
012  namespace Symfony\Polyfill\Mbstring;
013   
014  /**
015   * Partial mbstring implementation in PHP, iconv based, UTF-8 centric.
016   *
017   * Implemented:
018   * - mb_chr                  - Returns a specific character from its Unicode code point
019   * - mb_convert_encoding     - Convert character encoding
020   * - mb_convert_variables    - Convert character code in variable(s)
021   * - mb_decode_mimeheader    - Decode string in MIME header field
022   * - mb_encode_mimeheader    - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
023   * - mb_convert_case         - Perform case folding on a string
024   * - mb_get_info             - Get internal settings of mbstring
025   * - mb_http_input           - Detect HTTP input character encoding
026   * - mb_http_output          - Set/Get HTTP output character encoding
027   * - mb_internal_encoding    - Set/Get internal character encoding
028   * - mb_list_encodings       - Returns an array of all supported encodings
029   * - mb_ord                  - Returns the Unicode code point of a character
030   * - mb_output_handler       - Callback function converts character encoding in output buffer
031   * - mb_scrub                - Replaces ill-formed byte sequences with substitute characters
032   * - mb_strlen               - Get string length
033   * - mb_strpos               - Find position of first occurrence of string in a string
034   * - mb_strrpos              - Find position of last occurrence of a string in a string
035   * - mb_strtolower           - Make a string lowercase
036   * - mb_strtoupper           - Make a string uppercase
037   * - mb_substitute_character - Set/Get substitution character
038   * - mb_substr               - Get part of string
039   * - mb_stripos              - Finds position of first occurrence of a string within another, case insensitive
040   * - mb_stristr              - Finds first occurrence of a string within another, case insensitive
041   * - mb_strrchr              - Finds the last occurrence of a character in a string within another
042   * - mb_strrichr             - Finds the last occurrence of a character in a string within another, case insensitive
043   * - mb_strripos             - Finds position of last occurrence of a string within another, case insensitive
044   * - mb_strstr               - Finds first occurrence of a string within anothers
045   * - mb_strwidth             - Return width of string
046   * - mb_substr_count         - Count the number of substring occurrences
047   *
048   * Not implemented:
049   * - mb_convert_kana         - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
050   * - mb_decode_numericentity - Decode HTML numeric string reference to character
051   * - mb_encode_numericentity - Encode character to HTML numeric string reference
052   * - mb_ereg_*               - Regular expression with multibyte support
053   * - mb_parse_str            - Parse GET/POST/COOKIE data and set global variable
054   * - mb_preferred_mime_name  - Get MIME charset string
055   * - mb_regex_encoding       - Returns current encoding for multibyte regex as string
056   * - mb_regex_set_options    - Set/Get the default options for mbregex functions
057   * - mb_send_mail            - Send encoded mail
058   * - mb_split                - Split multibyte string using regular expression
059   * - mb_strcut               - Get part of string
060   * - mb_strimwidth           - Get truncated string with specified width
061   *
062   * @author Nicolas Grekas <p@tchwork.com>
063   *
064   * @internal
065   */
066  final class Mbstring
067  {
068      const MB_CASE_FOLD = PHP_INT_MAX;
069   
070      private static $encodingList = array('ASCII', 'UTF-8');
071      private static $language = 'neutral';
072      private static $internalEncoding = 'UTF-8';
073      private static $caseFold = array(
074          array('µ','ſ',"\xCD\x85",'ς',"\xCF\x90","\xCF\x91","\xCF\x95","\xCF\x96","\xCF\xB0","\xCF\xB1","\xCF\xB5","\xE1\xBA\x9B","\xE1\xBE\xBE"),
075          array('μ','s','ι',       'σ','β',       'θ',       'φ',       'π',       'κ',       'ρ',       'ε',       "\xE1\xB9\xA1",'ι'),
076      );
077   
078      public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
079      {
080          if (is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) {
081              $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
082          } else {
083              $fromEncoding = self::getEncoding($fromEncoding);
084          }
085   
086          $toEncoding = self::getEncoding($toEncoding);
087   
088          if ('BASE64' === $fromEncoding) {
089              $s = base64_decode($s);
090              $fromEncoding = $toEncoding;
091          }
092   
093          if ('BASE64' === $toEncoding) {
094              return base64_encode($s);
095          }
096   
097          if ('HTML-ENTITIES' === $toEncoding || 'HTML' === $toEncoding) {
098              if ('HTML-ENTITIES' === $fromEncoding || 'HTML' === $fromEncoding) {
099                  $fromEncoding = 'Windows-1252';
100              }
101              if ('UTF-8' !== $fromEncoding) {
102                  $s = iconv($fromEncoding, 'UTF-8//IGNORE', $s);
103              }
104   
105              return preg_replace_callback('/[\x80-\xFF]+/', array(__CLASS__, 'html_encoding_callback'), $s);
106          }
107   
108          if ('HTML-ENTITIES' === $fromEncoding) {
109              $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8');
110              $fromEncoding = 'UTF-8';
111          }
112   
113          return iconv($fromEncoding, $toEncoding.'//IGNORE', $s);
114      }
115   
116      public static function mb_convert_variables($toEncoding, $fromEncoding, &$a = null, &$b = null, &$c = null, &$d = null, &$e = null, &$f = null)
117      {
118          $vars = array(&$a, &$b, &$c, &$d, &$e, &$f);
119   
120          $ok = true;
121          array_walk_recursive($vars, function (&$v) use (&$ok, $toEncoding, $fromEncoding) {
122              if (false === $v = Mbstring::mb_convert_encoding($v, $toEncoding, $fromEncoding)) {
123                  $ok = false;
124              }
125          });
126   
127          return $ok ? $fromEncoding : false;
128      }
129   
130      public static function mb_decode_mimeheader($s)
131      {
132          return iconv_mime_decode($s, 2, self::$internalEncoding);
133      }
134   
135      public static function mb_encode_mimeheader($s, $charset = null, $transferEncoding = null, $linefeed = null, $indent = null)
136      {
137          trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING);
138      }
139   
140      public static function mb_convert_case($s, $mode, $encoding = null)
141      {
142          if ('' === $s .= '') {
143              return '';
144          }
145   
146          $encoding = self::getEncoding($encoding);
147   
148          if ('UTF-8' === $encoding) {
149              $encoding = null;
150          } else {
151              $s = iconv($encoding, 'UTF-8//IGNORE', $s);
152          }
153   
154          if (MB_CASE_TITLE == $mode) {
155              $s = preg_replace_callback('/\b\p{Ll}/u', array(__CLASS__, 'title_case_upper'), $s);
156              $s = preg_replace_callback('/\B[\p{Lu}\p{Lt}]+/u', array(__CLASS__, 'title_case_lower'), $s);
157          } else {
158              if (MB_CASE_UPPER == $mode) {
159                  static $upper = null;
160                  if (null === $upper) {
161                      $upper = self::getData('upperCase');
162                  }
163                  $map = $upper;
164              } else {
165                  if (self::MB_CASE_FOLD === $mode) {
166                      $s = str_replace(self::$caseFold[0], self::$caseFold[1], $s);
167                  }
168   
169                  static $lower = null;
170                  if (null === $lower) {
171                      $lower = self::getData('lowerCase');
172                  }
173                  $map = $lower;
174              }
175   
176              static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
177   
178              $i = 0;
179              $len = strlen($s);
180   
181              while ($i < $len) {
182                  $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
183                  $uchr = substr($s, $i, $ulen);
184                  $i += $ulen;
185   
186                  if (isset($map[$uchr])) {
187                      $uchr = $map[$uchr];
188                      $nlen = strlen($uchr);
189   
190                      if ($nlen == $ulen) {
191                          $nlen = $i;
192                          do {
193                              $s[--$nlen] = $uchr[--$ulen];
194                          } while ($ulen);
195                      } else {
196                          $s = substr_replace($s, $uchr, $i - $ulen, $ulen);
197                          $len += $nlen - $ulen;
198                          $i   += $nlen - $ulen;
199                      }
200                  }
201              }
202          }
203   
204          if (null === $encoding) {
205              return $s;
206          }
207   
208          return iconv('UTF-8', $encoding.'//IGNORE', $s);
209      }
210   
211      public static function mb_internal_encoding($encoding = null)
212      {
213          if (null === $encoding) {
214              return self::$internalEncoding;
215          }
216   
217          $encoding = self::getEncoding($encoding);
218   
219          if ('UTF-8' === $encoding || false !== @iconv($encoding, $encoding, ' ')) {
220              self::$internalEncoding = $encoding;
221   
222              return true;
223          }
224   
225          return false;
226      }
227   
228      public static function mb_language($lang = null)
229      {
230          if (null === $lang) {
231              return self::$language;
232          }
233   
234          switch ($lang = strtolower($lang)) {
235              case 'uni':
236              case 'neutral':
237                  self::$language = $lang;
238   
239                  return true;
240          }
241   
242          return false;
243      }
244   
245      public static function mb_list_encodings()
246      {
247          return array('UTF-8');
248      }
249   
250      public static function mb_encoding_aliases($encoding)
251      {
252          switch (strtoupper($encoding)) {
253              case 'UTF8':
254              case 'UTF-8':
255                  return array('utf8');
256          }
257   
258          return false;
259      }
260   
261      public static function mb_check_encoding($var = null, $encoding = null)
262      {
263          if (null === $encoding) {
264              if (null === $var) {
265                  return false;
266              }
267              $encoding = self::$internalEncoding;
268          }
269   
270          return self::mb_detect_encoding($var, array($encoding)) || false !== @iconv($encoding, $encoding, $var);
271      }
272   
273      public static function mb_detect_encoding($str, $encodingList = null, $strict = false)
274      {
275          if (null === $encodingList) {
276              $encodingList = self::$encodingList;
277          } else {
278              if (!is_array($encodingList)) {
279                  $encodingList = array_map('trim', explode(',', $encodingList));
280              }
281              $encodingList = array_map('strtoupper', $encodingList);
282          }
283   
284          foreach ($encodingList as $enc) {
285              switch ($enc) {
286                  case 'ASCII':
287                      if (!preg_match('/[\x80-\xFF]/', $str)) {
288                          return $enc;
289                      }
290                      break;
291   
292                  case 'UTF8':
293                  case 'UTF-8':
294                      if (preg_match('//u', $str)) {
295                          return 'UTF-8';
296                      }
297                      break;
298   
299                  default:
300                      if (0 === strncmp($enc, 'ISO-8859-', 9)) {
301                          return $enc;
302                      }
303              }
304          }
305   
306          return false;
307      }
308   
309      public static function mb_detect_order($encodingList = null)
310      {
311          if (null === $encodingList) {
312              return self::$encodingList;
313          }
314   
315          if (!is_array($encodingList)) {
316              $encodingList = array_map('trim', explode(',', $encodingList));
317          }
318          $encodingList = array_map('strtoupper', $encodingList);
319   
320          foreach ($encodingList as $enc) {
321              switch ($enc) {
322                  default:
323                      if (strncmp($enc, 'ISO-8859-', 9)) {
324                          return false;
325                      }
326                  case 'ASCII':
327                  case 'UTF8':
328                  case 'UTF-8':
329              }
330          }
331   
332          self::$encodingList = $encodingList;
333   
334          return true;
335      }
336   
337      public static function mb_strlen($s, $encoding = null)
338      {
339          switch ($encoding = self::getEncoding($encoding)) {
340              case 'ASCII':
341              case 'CP850':
342                  return strlen($s);
343          }
344   
345          return @iconv_strlen($s, $encoding);
346      }
347   
348      public static function mb_strpos($haystack, $needle, $offset = 0, $encoding = null)
349      {
350          $encoding = self::getEncoding($encoding);
351   
352          if ('' === $needle .= '') {
353              trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING);
354   
355              return false;
356          }
357   
358          return iconv_strpos($haystack, $needle, $offset, $encoding);
359      }
360   
361      public static function mb_strrpos($haystack, $needle, $offset = 0, $encoding = null)
362      {
363          $encoding = self::getEncoding($encoding);
364   
365          if ($offset != (int) $offset) {
366              $offset = 0;
367          } elseif ($offset = (int) $offset) {
368              if ($offset < 0) {
369                  $haystack = self::mb_substr($haystack, 0, $offset, $encoding);
370                  $offset = 0;
371              } else {
372                  $haystack = self::mb_substr($haystack, $offset, 2147483647, $encoding);
373              }
374          }
375   
376          $pos = iconv_strrpos($haystack, $needle, $encoding);
377   
378          return false !== $pos ? $offset + $pos : false;
379      }
380   
381      public static function mb_strtolower($s, $encoding = null)
382      {
383          return self::mb_convert_case($s, MB_CASE_LOWER, $encoding);
384      }
385   
386      public static function mb_strtoupper($s, $encoding = null)
387      {
388          return self::mb_convert_case($s, MB_CASE_UPPER, $encoding);
389      }
390   
391      public static function mb_substitute_character($c = null)
392      {
393          if (0 === strcasecmp($c, 'none')) {
394              return true;
395          }
396   
397          return null !== $c ? false : 'none';
398      }
399   
400      public static function mb_substr($s, $start, $length = null, $encoding = null)
401      {
402          $encoding = self::getEncoding($encoding);
403   
404          if ($start < 0) {
405              $start = iconv_strlen($s, $encoding) + $start;
406              if ($start < 0) {
407                  $start = 0;
408              }
409          }
410   
411          if (null === $length) {
412              $length = 2147483647;
413          } elseif ($length < 0) {
414              $length = iconv_strlen($s, $encoding) + $length - $start;
415              if ($length < 0) {
416                  return '';
417              }
418          }
419   
420          return iconv_substr($s, $start, $length, $encoding).'';
421      }
422   
423      public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
424      {
425          $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
426          $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
427   
428          return self::mb_strpos($haystack, $needle, $offset, $encoding);
429      }
430   
431      public static function mb_stristr($haystack, $needle, $part = false, $encoding = null)
432      {
433          $pos = self::mb_stripos($haystack, $needle, 0, $encoding);
434   
435          return self::getSubpart($pos, $part, $haystack, $encoding);
436      }
437   
438      public static function mb_strrchr($haystack, $needle, $part = false, $encoding = null)
439      {
440          $encoding = self::getEncoding($encoding);
441          $needle = self::mb_substr($needle, 0, 1, $encoding);
442          $pos = iconv_strrpos($haystack, $needle, $encoding);
443   
444          return self::getSubpart($pos, $part, $haystack, $encoding);
445      }
446   
447      public static function mb_strrichr($haystack, $needle, $part = false, $encoding = null)
448      {
449          $needle = self::mb_substr($needle, 0, 1, $encoding);
450          $pos = self::mb_strripos($haystack, $needle, $encoding);
451   
452          return self::getSubpart($pos, $part, $haystack, $encoding);
453      }
454   
455      public static function mb_strripos($haystack, $needle, $offset = 0, $encoding = null)
456      {
457          $haystack = self::mb_convert_case($haystack, self::MB_CASE_FOLD, $encoding);
458          $needle = self::mb_convert_case($needle, self::MB_CASE_FOLD, $encoding);
459   
460          return self::mb_strrpos($haystack, $needle, $offset, $encoding);
461      }
462   
463      public static function mb_strstr($haystack, $needle, $part = false, $encoding = null)
464      {
465          $pos = strpos($haystack, $needle);
466          if (false === $pos) {
467              return false;
468          }
469          if ($part) {
470              return substr($haystack, 0, $pos);
471          }
472   
473          return substr($haystack, $pos);
474      }
475   
476      public static function mb_get_info($type = 'all')
477      {
478          $info = array(
479              'internal_encoding' => self::$internalEncoding,
480              'http_output' => 'pass',
481              'http_output_conv_mimetypes' => '^(text/|application/xhtml\+xml)',
482              'func_overload' => 0,
483              'func_overload_list' => 'no overload',
484              'mail_charset' => 'UTF-8',
485              'mail_header_encoding' => 'BASE64',
486              'mail_body_encoding' => 'BASE64',
487              'illegal_chars' => 0,
488              'encoding_translation' => 'Off',
489              'language' => self::$language,
490              'detect_order' => self::$encodingList,
491              'substitute_character' => 'none',
492              'strict_detection' => 'Off',
493          );
494   
495          if ('all' === $type) {
496              return $info;
497          }
498          if (isset($info[$type])) {
499              return $info[$type];
500          }
501   
502          return false;
503      }
504   
505      public static function mb_http_input($type = '')
506      {
507          return false;
508      }
509   
510      public static function mb_http_output($encoding = null)
511      {
512          return null !== $encoding ? 'pass' === $encoding : 'pass';
513      }
514   
515      public static function mb_strwidth($s, $encoding = null)
516      {
517          $encoding = self::getEncoding($encoding);
518   
519          if ('UTF-8' !== $encoding) {
520              $s = iconv($encoding, 'UTF-8//IGNORE', $s);
521          }
522   
523          $s = preg_replace('/[\x{1100}-\x{115F}\x{2329}\x{232A}\x{2E80}-\x{303E}\x{3040}-\x{A4CF}\x{AC00}-\x{D7A3}\x{F900}-\x{FAFF}\x{FE10}-\x{FE19}\x{FE30}-\x{FE6F}\x{FF00}-\x{FF60}\x{FFE0}-\x{FFE6}\x{20000}-\x{2FFFD}\x{30000}-\x{3FFFD}]/u', '', $s, -1, $wide);
524   
525          return ($wide << 1) + iconv_strlen($s, 'UTF-8');
526      }
527   
528      public static function mb_substr_count($haystack, $needle, $encoding = null)
529      {
530          return substr_count($haystack, $needle);
531      }
532   
533      public static function mb_output_handler($contents, $status)
534      {
535          return $contents;
536      }
537   
538      public static function mb_chr($code, $encoding = null)
539      {
540          if (0x80 > $code %= 0x200000) {
541              $s = chr($code);
542          } elseif (0x800 > $code) {
543              $s = chr(0xC0 | $code >> 6).chr(0x80 | $code & 0x3F);
544          } elseif (0x10000 > $code) {
545              $s = chr(0xE0 | $code >> 12).chr(0x80 | $code >> 6 & 0x3F).chr(0x80 | $code & 0x3F);
546          } else {
547              $s = chr(0xF0 | $code >> 18).chr(0x80 | $code >> 12 & 0x3F).chr(0x80 | $code >> 6 & 0x3F).chr(0x80 | $code & 0x3F);
548          }
549   
550          if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
551              $s = mb_convert_encoding($s, $encoding, 'UTF-8');
552          }
553   
554          return $s;
555      }
556   
557      public static function mb_ord($s, $encoding = null)
558      {
559          if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
560              $s = mb_convert_encoding($s, 'UTF-8', $encoding);
561          }
562   
563          $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;
564          if (0xF0 <= $code) {
565              return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;
566          }
567          if (0xE0 <= $code) {
568              return (($code - 0xE0) << 12) + (($s[2] - 0x80) << 6) + $s[3] - 0x80;
569          }
570          if (0xC0 <= $code) {
571              return (($code - 0xC0) << 6) + $s[2] - 0x80;
572          }
573   
574          return $code;
575      }
576   
577      private static function getSubpart($pos, $part, $haystack, $encoding)
578      {
579          if (false === $pos) {
580              return false;
581          }
582          if ($part) {
583              return self::mb_substr($haystack, 0, $pos, $encoding);
584          }
585   
586          return self::mb_substr($haystack, $pos, null, $encoding);
587      }
588   
589      private static function html_encoding_callback($m)
590      {
591          $i = 1;
592          $entities = '';
593          $m = unpack('C*', htmlentities($m[0], ENT_COMPAT, 'UTF-8'));
594   
595          while (isset($m[$i])) {
596              if (0x80 > $m[$i]) {
597                  $entities .= chr($m[$i++]);
598                  continue;
599              }
600              if (0xF0 <= $m[$i]) {
601                  $c = (($m[$i++] - 0xF0) << 18) + (($m[$i++] - 0x80) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
602              } elseif (0xE0 <= $m[$i]) {
603                  $c = (($m[$i++] - 0xE0) << 12) + (($m[$i++] - 0x80) << 6) + $m[$i++] - 0x80;
604              } else {
605                  $c = (($m[$i++] - 0xC0) << 6) + $m[$i++] - 0x80;
606              }
607   
608              $entities .= '&#'.$c.';';
609          }
610   
611          return $entities;
612      }
613   
614      private static function title_case_lower($s)
615      {
616          return self::mb_convert_case($s[0], MB_CASE_LOWER, 'UTF-8');
617      }
618   
619      private static function title_case_upper($s)
620      {
621          return self::mb_convert_case($s[0], MB_CASE_UPPER, 'UTF-8');
622      }
623   
624      private static function getData($file)
625      {
626          if (file_exists($file = __DIR__.'/Resources/unidata/'.$file.'.php')) {
627              return require $file;
628          }
629   
630          return false;
631      }
632   
633      private static function getEncoding($encoding)
634      {
635          if (null === $encoding) {
636              return self::$internalEncoding;
637          }
638   
639          $encoding = strtoupper($encoding);
640   
641          if ('8BIT' === $encoding || 'BINARY' === $encoding) {
642              return 'CP850';
643          }
644          if ('UTF8' === $encoding) {
645              return 'UTF-8';
646          }
647   
648          return $encoding;
649      }
650  }
651