source: www/mysql/libraries/string.lib.php@ 1

Last change on this file since 1 was 1, checked in by george, 17 years ago

Prvotní import všeho

File size: 10.4 KB
Line 
1<?php
2/* $Id: string.lib.php 8301 2006-01-17 17:03:02Z cybot_tm $ */
3// vim: expandtab sw=4 ts=4 sts=4:
4
5/** Specialized String Functions for phpMyAdmin
6 *
7 * Copyright 2002 Robin Johnson <robbat2@users.sourceforge.net>
8 * http://www.orbis-terrarum.net/?l=people.robbat2
9 *
10 * Defines a set of function callbacks that have a pure C version available if
11 * the "ctype" extension is available, but otherwise have PHP versions to use
12 * (that are slower).
13 *
14 * The SQL Parser code relies heavily on these functions.
15 */
16
17/* Try to load mbstring, unless we're using buggy php version */
18if (PMA_PHP_INT_VERSION != 40203) {
19 if (!@extension_loaded('mbstring')) {
20 PMA_dl('mbstring');
21 }
22}
23
24/* windows-* and tis-620 are not supported and are not multibyte,
25 * others can be ignored as they're not multibyte */
26$GLOBALS['using_mb_charset'] =
27 substr($GLOBALS['charset'], 0, 8) != 'windows-' &&
28 substr($GLOBALS['charset'], 0, 9) != 'iso-8859-' &&
29 substr($GLOBALS['charset'], 0, 3) != 'cp-' &&
30 $GLOBALS['charset'] != 'koi8-r' &&
31 $GLOBALS['charset'] != 'tis-620';
32
33$GLOBALS['PMA_allow_mbstr'] = @function_exists('mb_strlen') && $GLOBALS['using_mb_charset'];
34
35if ($GLOBALS['PMA_allow_mbstr']) {
36 // the hebrew lang file uses iso-8859-8-i, encoded RTL,
37 // but mb_internal_encoding only supports iso-8859-8
38 if ($GLOBALS['charset'] == 'iso-8859-8-i'){
39 mb_internal_encoding('iso-8859-8');
40 } else {
41 mb_internal_encoding($GLOBALS['charset']);
42 }
43}
44
45// This is for handling input better
46if (defined('PMA_MULTIBYTE_ENCODING') || $GLOBALS['PMA_allow_mbstr']) {
47 $GLOBALS['PMA_strpos'] = 'mb_strpos';
48 $GLOBALS['PMA_strrpos'] = 'mb_strrpos';
49} else {
50 $GLOBALS['PMA_strpos'] = 'strpos';
51 $GLOBALS['PMA_strrpos'] = 'strrpos';
52}
53
54/**
55 * Returns length of string depending on current charset.
56 *
57 * @param string string to count
58 *
59 * @return int string length
60 *
61 * @access public
62 *
63 * @author nijel
64 */
65function PMA_strlen($string)
66{
67 // windows-* charsets are not multibyte and not supported by mb_*
68 if (defined('PMA_MULTIBYTE_ENCODING') || $GLOBALS['PMA_allow_mbstr']) {
69 return mb_strlen($string);
70 } else {
71 return strlen($string);
72 }
73}
74
75/**
76 * Returns substring from string, works depending on current charset.
77 *
78 * @param string string to count
79 * @param int start of substring
80 * @param int length of substring
81 *
82 * @return int substring
83 *
84 * @access public
85 *
86 * @author nijel
87 */
88function PMA_substr($string, $start, $length = 2147483647)
89{
90 if (defined('PMA_MULTIBYTE_ENCODING') || $GLOBALS['PMA_allow_mbstr']) {
91 return mb_substr($string, $start, $length);
92 } else {
93 return substr($string, $start, $length);
94 }
95}
96
97
98/**
99 * This checks if a string actually exists inside another string
100 * We try to do it in a PHP3-portable way.
101 * We don't care about the position it is in.
102 *
103 * @param string string to search for
104 * @param string string to search in
105 *
106 * @return boolean whether the needle is in the haystack or not
107 */
108function PMA_STR_strInStr($needle, $haystack)
109{
110 // $GLOBALS['PMA_strpos']($haystack, $needle) !== FALSE
111 // return (is_integer($GLOBALS['PMA_strpos']($haystack, $needle)));
112 return $GLOBALS['PMA_strpos'](' ' . $haystack, $needle);
113} // end of the "PMA_STR_strInStr()" function
114
115
116/**
117 * Checks if a given character position in the string is escaped or not
118 *
119 * @param string string to check for
120 * @param integer the character to check for
121 * @param integer starting position in the string
122 *
123 * @return boolean whether the character is escaped or not
124 */
125function PMA_STR_charIsEscaped($string, $pos, $start = 0)
126{
127 $len = PMA_strlen($string);
128 // Base case:
129 // Check for string length or invalid input or special case of input
130 // (pos == $start)
131 if (($pos == $start) || ($len <= $pos)) {
132 return FALSE;
133 }
134
135 $p = $pos - 1;
136 $escaped = FALSE;
137 while (($p >= $start) && (PMA_substr($string, $p, 1) == '\\')) {
138 $escaped = !$escaped;
139 $p--;
140 } // end while
141
142 if ($pos < $start) {
143 // throw error about strings
144 }
145
146 return $escaped;
147} // end of the "PMA_STR_charIsEscaped()" function
148
149
150/**
151 * Checks if a number is in a range
152 *
153 * @param integer number to check for
154 * @param integer lower bound
155 * @param integer upper bound
156 *
157 * @return boolean whether the number is in the range or not
158 */
159function PMA_STR_numberInRangeInclusive($num, $lower, $upper)
160{
161 return (($num >= $lower) && ($num <= $upper));
162} // end of the "PMA_STR_numberInRangeInclusive()" function
163
164
165/**
166 * Checks if a character is a digit
167 *
168 * @param string character to check for
169 *
170 * @return boolean whether the character is a digit or not
171 *
172 * @see PMA_STR_numberInRangeInclusive()
173 */
174function PMA_STR_isDigit($c)
175{
176 $ord_zero = 48; //ord('0');
177 $ord_nine = 57; //ord('9');
178 $ord_c = ord($c);
179
180 return PMA_STR_numberInRangeInclusive($ord_c, $ord_zero, $ord_nine);
181} // end of the "PMA_STR_isDigit()" function
182
183
184/**
185 * Checks if a character is an hexadecimal digit
186 *
187 * @param string character to check for
188 *
189 * @return boolean whether the character is an hexadecimal digit or not
190 *
191 * @see PMA_STR_numberInRangeInclusive()
192 */
193function PMA_STR_isHexDigit($c)
194{
195 $ord_Aupper = 65; //ord('A');
196 $ord_Fupper = 70; //ord('F');
197 $ord_Alower = 97; //ord('a');
198 $ord_Flower = 102; //ord('f');
199 $ord_zero = 48; //ord('0');
200 $ord_nine = 57; //ord('9');
201 $ord_c = ord($c);
202
203 return (PMA_STR_numberInRangeInclusive($ord_c, $ord_zero, $ord_nine)
204 || PMA_STR_numberInRangeInclusive($ord_c, $ord_Aupper, $ord_Fupper)
205 || PMA_STR_numberInRangeInclusive($ord_c, $ord_Alower, $ord_Flower));
206} // end of the "PMA_STR_isHexDigit()" function
207
208
209/**
210 * Checks if a character is an upper alphabetic one
211 *
212 * @param string character to check for
213 *
214 * @return boolean whether the character is an upper alphabetic one or
215 * not
216 *
217 * @see PMA_STR_numberInRangeInclusive()
218 */
219function PMA_STR_isUpper($c)
220{
221 $ord_zero = 65; //ord('A');
222 $ord_nine = 90; //ord('Z');
223 $ord_c = ord($c);
224
225 return PMA_STR_numberInRangeInclusive($ord_c, $ord_zero, $ord_nine);
226} // end of the "PMA_STR_isUpper()" function
227
228
229/**
230 * Checks if a character is a lower alphabetic one
231 *
232 * @param string character to check for
233 *
234 * @return boolean whether the character is a lower alphabetic one or
235 * not
236 *
237 * @see PMA_STR_numberInRangeInclusive()
238 */
239function PMA_STR_isLower($c)
240{
241 $ord_zero = 97; //ord('a');
242 $ord_nine = 122; //ord('z');
243 $ord_c = ord($c);
244
245 return PMA_STR_numberInRangeInclusive($ord_c, $ord_zero, $ord_nine);
246} // end of the "PMA_STR_isLower()" function
247
248
249/**
250 * Checks if a character is an alphabetic one
251 *
252 * @param string character to check for
253 *
254 * @return boolean whether the character is an alphabetic one or not
255 *
256 * @see PMA_STR_isUpper()
257 * @see PMA_STR_isLower()
258 */
259function PMA_STR_isAlpha($c)
260{
261 return (PMA_STR_isUpper($c) || PMA_STR_isLower($c));
262} // end of the "PMA_STR_isAlpha()" function
263
264
265/**
266 * Checks if a character is an alphanumeric one
267 *
268 * @param string character to check for
269 *
270 * @return boolean whether the character is an alphanumeric one or not
271 *
272 * @see PMA_STR_isUpper()
273 * @see PMA_STR_isLower()
274 * @see PMA_STR_isDigit()
275 */
276function PMA_STR_isAlnum($c)
277{
278 return (PMA_STR_isUpper($c) || PMA_STR_isLower($c) || PMA_STR_isDigit($c));
279} // end of the "PMA_STR_isAlnum()" function
280
281
282/**
283 * Checks if a character is a space one
284 *
285 * @param string character to check for
286 *
287 * @return boolean whether the character is a space one or not
288 *
289 * @see PMA_STR_numberInRangeInclusive()
290 */
291function PMA_STR_isSpace($c)
292{
293 $ord_space = 32; //ord(' ')
294 $ord_tab = 9; //ord('\t')
295 $ord_CR = 13; //ord('\n')
296 $ord_NOBR = 160; //ord('U+00A0);
297 $ord_c = ord($c);
298
299 return (($ord_c == $ord_space)
300 || ($ord_c == $ord_NOBR)
301 || PMA_STR_numberInRangeInclusive($ord_c, $ord_tab, $ord_CR));
302} // end of the "PMA_STR_isSpace()" function
303
304
305/**
306 * Checks if a character is an accented character
307 *
308 * @note Presently this only works for some character sets. More work
309 * may be needed to fix it.
310 *
311 * @param string character to check for
312 *
313 * @return boolean whether the character is an accented one or not
314 *
315 * @see PMA_STR_numberInRangeInclusive()
316 */
317function PMA_STR_isAccented($c)
318{
319 $ord_min1 = 192; //ord('A');
320 $ord_max1 = 214; //ord('Z');
321 $ord_min2 = 216; //ord('A');
322 $ord_max2 = 246; //ord('Z');
323 $ord_min3 = 248; //ord('A');
324 $ord_max3 = 255; //ord('Z');
325
326 $ord_c = ord($c);
327
328 return PMA_STR_numberInRangeInclusive($ord_c, $ord_min1, $ord_max1)
329 || PMA_STR_numberInRangeInclusive($ord_c, $ord_min2, $ord_max2)
330 || PMA_STR_numberInRangeInclusive($ord_c, $ord_min2, $ord_max2);
331} // end of the "PMA_STR_isAccented()" function
332
333
334/**
335 * Checks if a character is an SQL identifier
336 *
337 * @param string character to check for
338 * @param boolean whether the dot character is valid or not
339 *
340 * @return boolean whether the character is an SQL identifier or not
341 *
342 * @see PMA_STR_isAlnum()
343 */
344function PMA_STR_isSqlIdentifier($c, $dot_is_valid = FALSE)
345{
346 return (PMA_STR_isAlnum($c)
347 || PMA_STR_isAccented($c)
348 || ($c == '_') || ($c == '$')
349 || (($dot_is_valid != FALSE) && ($c == '.')));
350} // end of the "PMA_STR_isSqlIdentifier()" function
351
352
353/**
354 * Binary search of a value in a sorted array
355 *
356 * @param string string to search for
357 * @param array sorted array to search into
358 * @param integer size of sorted array to search into
359 *
360 * @return boolean whether the string has been found or not
361 */
362function PMA_STR_binarySearchInArr($str, $arr, $arrsize)
363{
364 // $arr MUST be sorted, due to binary search
365 $top = $arrsize - 1;
366 $bottom = 0;
367 $found = FALSE;
368
369 while (($top >= $bottom) && ($found == FALSE)) {
370 $mid = intval(($top + $bottom) / 2);
371 $res = strcmp($str, $arr[$mid]);
372 if ($res == 0) {
373 $found = TRUE;
374 } elseif ($res < 0) {
375 $top = $mid - 1;
376 } else {
377 $bottom = $mid + 1;
378 }
379 } // end while
380
381 return $found;
382} // end of the "PMA_STR_binarySearchInArr()" function
383
384?>
Note: See TracBrowser for help on using the repository browser.