mbstringmodule.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 1,249 行 · 第 1/3 页
JAVA
1,249 行
} /** * Multibyte version of strlen. */ public static LongValue mb_strlen(Env env, StringValue str, @Optional("") String encoding) { encoding = getEncoding(env, encoding); str = str.convertToUnicode(env, encoding); return LongValue.create(str.length()); } /** * Multibyte version of strpos. */ public static Value mb_strpos(Env env, StringValue haystack, StringValue needle, @Optional("0") int offset, @Optional("") String encoding) { encoding = getEncoding(env, encoding); haystack = haystack.convertToUnicode(env, encoding); needle = needle.convertToUnicode(env, encoding); return StringModule.strpos(haystack, needle, offset); } /** * Multibyte version of strrpos. */ public static Value mb_strrpos(Env env, StringValue haystack, StringValue needle, @Optional Value offsetV, @Optional("") String encoding) { encoding = getEncoding(env, encoding); haystack = haystack.convertToUnicode(env, encoding); needle = needle.convertToUnicode(env, encoding); return StringModule.strrpos(haystack, needle, offsetV); } /** * Converts all characters to lower-case. */ public static StringValue mb_strtolower(Env env, StringValue str, @Optional("") String encoding) { encoding = getEncoding(env, encoding); StringValue unicodeStr = str.convertToUnicode(env, encoding); unicodeStr = StringModule.strtolower(str); return str.create(env, unicodeStr, encoding); } /** * Converts all characters to upper-case. */ public static StringValue mb_strtoupper(Env env, StringValue str, @Optional("") String encoding) { encoding = getEncoding(env, encoding); StringValue unicodeStr = str.convertToUnicode(env, encoding); unicodeStr = StringModule.strtoupper(str); return str.create(env, unicodeStr, encoding); } /** * Returns the width of this multibyte string. */ public static LongValue mb_strwidth(Env env, StringValue str, @Optional("") String encoding) { encoding = getEncoding(env, encoding); str = str.convertToUnicode(env, encoding); return LongValue.create(str.length());/* int width = 0; int len = string.length(); // Per PHP manual for (int i = 0; i < len; i++) { char ch = string.charAt(i); if (ch <= 0x19) continue; else if (ch <= 0x1fff) width += 1; else if (ch <= 0xff60) width += 2; else if (ch <= 0xff9f) width += 1; else width += 2; } return LongValue.create(width);*/ } /** * Sets the character to use when decoding/encoding fails on a character. */ public static Value mb_substitute_character(Value substrchar) { throw new UnimplementedException("mb_substitute_character"); } public static LongValue mb_substr_count(Env env, StringValue haystack, StringValue needle, @Optional("") String encoding) { encoding = getEncoding(env, encoding); haystack = haystack.convertToUnicode(env, encoding); needle = needle.convertToUnicode(env, encoding); int count = 0; int sublen = needle.length(); int i = haystack.indexOf(needle); while (i >= 0) { i = haystack.indexOf(needle, i + sublen); count++; } return LongValue.create(count); } /** * Multibyte version of substr. */ public static StringValue mb_substr(Env env, StringValue str, int start, @Optional Value lengthV, @Optional String encoding) { encoding = getEncoding(env, encoding); StringValue unicodeStr = str.convertToUnicode(env, encoding); Value val = StringModule.substr(env, unicodeStr, start, lengthV); if (val == BooleanValue.FALSE) return str.getEmptyString(); return str.create(env, val.toStringValue(), encoding); } // Private helper functions /** * Returns string with words capitalized and intermediate letters are * made lower-case. */ private static StringValue toUpperCaseTitle(Env env, StringValue string) { StringValue sb = string.createStringBuilder(); int strLen = string.length(); boolean isWordStart = true; for (int i = 0; i < strLen; i++) { char ch = string.charAt(i); switch (ch) { case ' ': case '\t': case '\r': case '\n': isWordStart = true; sb.append(ch); break; default: if (isWordStart) { sb.append(Character.toUpperCase(ch)); isWordStart = false; } else sb.append(Character.toLowerCase(ch)); break; } } return sb; } private static String getEncoding(Env env) { Value encoding = env.getIni("mbstring.internal_encoding"); if (encoding.length() > 0) return encoding.toString(); else return env.getRuntimeEncoding(); } private static String getEncoding(Env env, String encoding) { if (encoding == null || encoding.length() == 0) return getEncoding(env); else return encoding; } private static void setEncoding(Env env, String encoding) { env.setIni("mbstring.internal_encoding", encoding); } private static String getOutputEncoding(Env env) { Value encoding = env.getIni("mbstring.http_output"); if (encoding.length() != 0) return encoding.toString(); else return env.getOutputEncoding(); } /** * Recursively decodes objects and arrays. */ private static Value decodeAll(Env env, Value val, String encoding) { val = val.toValue(); if (val instanceof StringValue) return ((StringValue)val).convertToUnicode(env, encoding); else if (val instanceof ArrayValue) { ArrayValue array = new ArrayValueImpl(); for (Map.Entry<Value,Value> entry : ((ArrayValue)val).entrySet()) { array.put(entry.getKey(), decodeAll(env, entry.getValue(), encoding)); } return array; } else if (val instanceof ObjectValue) { ObjectValue obj = (ObjectValue)val; for (Map.Entry<Value,Value> entry : obj.entrySet()) { obj.putField(env, entry.getKey().toStringValue(), decodeAll(env, entry.getValue(), encoding)); } return obj; } else return val; } /** * Recursively encodes objects and arrays. */ private static Value encodeAll(Env env, Value val, String encoding) { val = val.toValue(); if (val instanceof StringValue) { StringValue sb = env.createBinaryBuilder(); sb.append(env, (StringValue) val, encoding); return sb; } else if (val instanceof ArrayValue) { ArrayValue array = new ArrayValueImpl(); for (Map.Entry<Value,Value> entry : ((ArrayValue)val).entrySet()) { array.put(entry.getKey(), encodeAll(env, entry.getValue(), encoding)); } return array; } else if (val instanceof ObjectValue) { ObjectValue obj = (ObjectValue)val; for (Map.Entry<Value,Value> entry : obj.entrySet()) { obj.putField(env, entry.getKey().toStringValue(), encodeAll(env, entry.getValue(), encoding)); } return obj; } else return val; } private static StringValue decodeEncode(Env env, StringValue val, String srcEncoding, String destEncoding) { try { return UnicodeUtility.decodeEncode(env, val, srcEncoding, destEncoding); } catch (UnsupportedEncodingException e) { throw new QuercusModuleException(e.getMessage()); } } /** * ereg state object (saves previous match and other info) * * XXX: option */ static class EregSearch { private StringValue _string; private StringValue _pattern; private Value _option; private int _length; ArrayValue _lastMatch; int _position; boolean _isValidRegexp; EregSearch(Env env, StringValue string, Value pattern, Value option) { _string = string.convertToUnicode(env, getEncoding(env)); _position = 0; _length = _string.length(); init(env, pattern, option); } void init(Env env, Value pattern, Value option) { _option = option; initPattern(env, pattern); } void initPattern(Env env, Value pattern) { if (pattern instanceof StringValue) { _pattern = pattern.toStringValue(); _isValidRegexp = true; } else _isValidRegexp = (_pattern != null); } StringValue getString(Env env) { if (_position == 0) return _string; else if (_position < _length) return _string.substring(_position); else return StringValue.EMPTY; } Value search(Env env, boolean isArrayReturn) { StringValue string = getString(env); ArrayValue regs = new ArrayValueImpl(); Value val = eregImpl(env, _pattern, string, regs, true); if (val == BooleanValue.FALSE) return BooleanValue.FALSE; StringValue match = regs.get(LongValue.ZERO).toStringValue(); int matchIndex = _string.indexOf(match, _position); int matchLength = match.length(); _position = matchIndex + matchLength; _lastMatch = regs; if (isArrayReturn) { ArrayValue array = new ArrayValueImpl(); array.put(LongValue.create(matchIndex)); array.put(LongValue.create(matchLength)); return array; } else return BooleanValue.TRUE; } } static final IniDefinition INI_MBSTRING_HTTP_INPUT = _iniDefinitions.add("mbstring.http_input", "pass", PHP_INI_ALL); static final IniDefinition INI_MBSTRING_HTTP_OUTPUT = _iniDefinitions.add("mbstring.http_output", "pass", PHP_INI_ALL);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?