validator/isChinese.js

const chineseDictionary = {
  // 基本汉字
  chineseBasic: '[\u4e00-\u9fa5]',

  // 基本汉字补充
  chineseExtend: '[\u9ea6-\u9fef]',

  // 汉字扩展A
  chineseExtendA: '[\u3400-\u4DB5]',

  // 汉字扩展B
  chineseExtendB: '[\u{20000}-\u{2A6D6}]',

  // 汉字扩展C
  chineseExtendC: '[\u{2A700}-\u{2B734}]',

  // 汉字扩展D
  chineseExtendD: '[\u{2B740}-\u{2B81D}]',

  // 汉字扩展E
  chineseExtendE: '[\u{2B820}-\u{2CEA1}]',

  // 汉字扩展F
  chineseExtendF: '[\u{2CEB0}-\u{2EBE0}]',
};

let looseChineseRegExp = chineseDictionary.chineseBasic + '+';

let chineseRegExp = '^' + chineseDictionary.chineseBasic + '+$';

const supportRegExpUnicode = RegExp.prototype.hasOwnProperty('unicode');

if (supportRegExpUnicode) {
  looseChineseRegExp = '(?:' +
    chineseDictionary.chineseBasic + '|' +
    chineseDictionary.chineseExtend + '|' +
    chineseDictionary.chineseExtendA + '|' +
    chineseDictionary.chineseExtendB + '|' +
    chineseDictionary.chineseExtendC + '|' +
    chineseDictionary.chineseExtendD + '|' +
    chineseDictionary.chineseExtendE + '|' +
    chineseDictionary.chineseExtendF + ')+';
  chineseRegExp = '^(?:' +
    chineseDictionary.chineseBasic + '|' +
    chineseDictionary.chineseExtend + '|' +
    chineseDictionary.chineseExtendA + '|' +
    chineseDictionary.chineseExtendB + '|' +
    chineseDictionary.chineseExtendC + '|' +
    chineseDictionary.chineseExtendD + '|' +
    chineseDictionary.chineseExtendE + '|' +
    chineseDictionary.chineseExtendF + ')+$';
}

/**
 * 检测值是否为中文
 * 
 * @static
 * @alias module:Validator.isChinese
 * @since 1.1.0
 * @see {@link http://www.unicode.org/reports/tr38/#BlockListing|4.4 Listing of Characters Covered by the Unihan Database}
 * @param {String} value 要检测的值
 * @param {Object} [options] 配置项
 * @param {Boolean} [options.loose=false] 宽松模式。如果为true,只要包含中文即为true
 * @returns {Boolean} 值是否为中文
 * @example
 * 
 * isChinese('林某某');
 * // => true
 *
 * isChinese('林A');
 * // => false
 *
 * // 宽松模式,只要包含中文即为true
 * isChinese('林A', {loose: true});
 * // => true
 *
 * isChinese('A林A', {loose: true});
 * // => true
 * 
 */
function isChinese(value, {
  loose = false
} = {}) {
  const reg = new RegExp(loose ? looseChineseRegExp : chineseRegExp, supportRegExpUnicode ? 'u' : null);
  return reg.test(value);
}

export default isChinese;