MediaWiki
REL1_22
|
00001 <?php 00026 class Fallback { 00027 00034 public static function iconv( $from, $to, $string ) { 00035 if ( substr( $to, -8 ) == '//IGNORE' ) { 00036 $to = substr( $to, 0, strlen( $to ) - 8 ); 00037 } 00038 if ( strcasecmp( $from, $to ) == 0 ) { 00039 return $string; 00040 } 00041 if ( strcasecmp( $from, 'utf-8' ) == 0 ) { 00042 return utf8_decode( $string ); 00043 } 00044 if ( strcasecmp( $to, 'utf-8' ) == 0 ) { 00045 return utf8_encode( $string ); 00046 } 00047 return $string; 00048 } 00049 00066 public static function mb_substr( $str, $start, $count = 'end' ) { 00067 if ( $start != 0 ) { 00068 $split = self::mb_substr_split_unicode( $str, intval( $start ) ); 00069 $str = substr( $str, $split ); 00070 } 00071 00072 if ( $count !== 'end' ) { 00073 $split = self::mb_substr_split_unicode( $str, intval( $count ) ); 00074 $str = substr( $str, 0, $split ); 00075 } 00076 00077 return $str; 00078 } 00079 00085 public static function mb_substr_split_unicode( $str, $splitPos ) { 00086 if ( $splitPos == 0 ) { 00087 return 0; 00088 } 00089 00090 $byteLen = strlen( $str ); 00091 00092 if ( $splitPos > 0 ) { 00093 if ( $splitPos > 256 ) { 00094 // Optimize large string offsets by skipping ahead N bytes. 00095 // This will cut out most of our slow time on Latin-based text, 00096 // and 1/2 to 1/3 on East European and Asian scripts. 00097 $bytePos = $splitPos; 00098 while ( $bytePos < $byteLen && $str[$bytePos] >= "\x80" && $str[$bytePos] < "\xc0" ) { 00099 ++$bytePos; 00100 } 00101 $charPos = mb_strlen( substr( $str, 0, $bytePos ) ); 00102 } else { 00103 $charPos = 0; 00104 $bytePos = 0; 00105 } 00106 00107 while ( $charPos++ < $splitPos ) { 00108 ++$bytePos; 00109 // Move past any tail bytes 00110 while ( $bytePos < $byteLen && $str[$bytePos] >= "\x80" && $str[$bytePos] < "\xc0" ) { 00111 ++$bytePos; 00112 } 00113 } 00114 } else { 00115 $splitPosX = $splitPos + 1; 00116 $charPos = 0; // relative to end of string; we don't care about the actual char position here 00117 $bytePos = $byteLen; 00118 while ( $bytePos > 0 && $charPos-- >= $splitPosX ) { 00119 --$bytePos; 00120 // Move past any tail bytes 00121 while ( $bytePos > 0 && $str[$bytePos] >= "\x80" && $str[$bytePos] < "\xc0" ) { 00122 --$bytePos; 00123 } 00124 } 00125 } 00126 00127 return $bytePos; 00128 } 00129 00136 public static function mb_strlen( $str, $enc = '' ) { 00137 $counts = count_chars( $str ); 00138 $total = 0; 00139 00140 // Count ASCII bytes 00141 for ( $i = 0; $i < 0x80; $i++ ) { 00142 $total += $counts[$i]; 00143 } 00144 00145 // Count multibyte sequence heads 00146 for ( $i = 0xc0; $i < 0xff; $i++ ) { 00147 $total += $counts[$i]; 00148 } 00149 return $total; 00150 } 00151 00160 public static function mb_strpos( $haystack, $needle, $offset = 0, $encoding = '' ) { 00161 $needle = preg_quote( $needle, '/' ); 00162 00163 $ar = array(); 00164 preg_match( '/' . $needle . '/u', $haystack, $ar, PREG_OFFSET_CAPTURE, $offset ); 00165 00166 if ( isset( $ar[0][1] ) ) { 00167 return $ar[0][1]; 00168 } else { 00169 return false; 00170 } 00171 } 00172 00181 public static function mb_strrpos( $haystack, $needle, $offset = 0, $encoding = '' ) { 00182 $needle = preg_quote( $needle, '/' ); 00183 00184 $ar = array(); 00185 preg_match_all( '/' . $needle . '/u', $haystack, $ar, PREG_OFFSET_CAPTURE, $offset ); 00186 00187 if ( isset( $ar[0] ) && count( $ar[0] ) > 0 && 00188 isset( $ar[0][count( $ar[0] ) - 1][1] ) ) { 00189 return $ar[0][count( $ar[0] ) - 1][1]; 00190 } else { 00191 return false; 00192 } 00193 } 00194 }