Skip to content

Instantly share code, notes, and snippets.

@masakielastic
Created December 23, 2014 06:24
Show Gist options
  • Save masakielastic/52f2d52bfaa365c31ed3 to your computer and use it in GitHub Desktop.
Save masakielastic/52f2d52bfaa365c31ed3 to your computer and use it in GitHub Desktop.
$str = "葛\xF3\xA0\x84\x81飾区";
var_dump(
3 === grapheme_length($str)
);
function grapheme_length($str)
{
$length = mb_strlen($str, 'UTF-8');
$pos = 0;
$ret = 0;
while ($pos < $length) {
$pos += grapheme_next($str, $length, $pos);
++$ret;
}
return $ret;
}
function grapheme_next($str, $length, $pos)
{
$grapheme_length = 0;
while ($pos < $length) {
$pos += 1;
$grapheme_length += 1;
$previous = mb_substr($str, $pos - 1, 1, 'UTF-8');
$current = mb_substr($str, $pos, 1, 'UTF-8');
$should_break = is_boundary($previous, $current);
if ($should_break) {
break;
}
}
return $grapheme_length;
}
function is_boundary($previous, $current)
{
# GB3. CR X LF
if (in_char_class($previous, ['cr']) && in_char_class($current, ['lf'])) {
return false;
# GB4. (Control|CR|LF) ÷
} else if (in_char_class($previous, ['control', 'cr', 'lf'])) {
return true;
# GB5. ÷ (Control|CR|LF)
} else if (in_char_class($current, ['control', 'cr', 'lf'])) {
return true;
# GB6. L X (L|V|LV|LVT)
} else if (in_char_class($previous, ['l']) && in_char_class($current, ['l', 'v', 'lv', 'lvt'])) {
return false;
# GB7. (LV|V) X (V|T)
} else if (in_char_class($previous, ['lv', 'v']) && in_char_class($current, ['v', 't'])) {
return false;
# GB8. (LVT|T) X (T)
} else if (in_char_class($previous, ['lvt', 't']) && in_char_class($current, ['t'])) {
return false;
# GB8a. Regional_Indicator X Regional_Indicator
} else if (in_char_class($previous, ['regional_indicator']) && in_char_class($current, ['tegional_indicator'])) {
return false;
# GB9. X Extend
} else if (in_char_class($current, ['extend'])) {
return false;
# GB9a. X SpacingMark
} else if (in_char_class($current, ['spacingmark'])) {
return false;
# GB9b. Prepend X
} else if (in_char_class($previous, ['pretend'])) {
return false;
# GB10. Any ÷ Any
}
return true;
}
function in_char_class($char, $classes) {
$regex = [
'cr' => '/\x{D}/u',
'lf' => '/\x{A}/u',
'control' => '/[\x{0}-\x{9}]|[\x{B}-\x{C}]|[\x{E}-\x{1F}]|[\x{7F}-\x{9F}]|\x{AD}|[\x{600}-\x{605}]|\x{61C}|\x{6DD}|\x{70F}|\x{180E}|\x{200B}|[\x{200E}-\x{200F}]|[\x{2028}-\x{202E}]|[\x{2060}-\x{206F}]|[\x{FEFF}|[\x{FFF0}-\x{FFFB}]|\x{110BD}|[\x{1BCA0}-\x{1BCA3}]|[\x{1D173}-\x{1D17A}]|[\x{E0000}-\x{E00FF}]|[\x{E01F0}-\x{E0FFF}]/u',
'extend' => '/[\x{300}-\x{36F}]|[\x{483}-\x{489}]|[\x{591}-\x{5BD}]|\x{5BF}|[\x{5C1}-\x{5C2}]|[\x{5C4}-\x{5C5}]|\x{5C7}|[\x{610}-\x{61A}]|[\x{64B}-\x{65F}]|\x{670}|[\x{6D6}-\x{6DC}]|[\x{6DF}-\x{6E4}]|[\x{6E7}-\x{6E8}]|[\x{6EA}-\x{6ED}]|\x{711}|[\x{730}-\x{74A}]|[\x{7A6}-\x{7B0}]|[\x{7EB}-\x{7F3}]|[\x{816}-\x{819}]|[\x{81B}-\x{823}]|[\x{825}-\x{827}]|[\x{829}-\x{82D}]|[\x{859}-\x{85B}]|[\x{8E4}-\x{902}]|\x{93A}|\x{93C}|[\x{941}-\x{948}]|\x{94D}|[\x{951}-\x{957}]|[\x{962}-\x{963}]|\x{981}|\x{9BC}|\x{9BE}|[\x{9C1}-\x{9C4}]|\x{9CD}|\x{9D7}|[\x{9E2}-\x{9E3}]|[\x{A01}-\x{A02}]|\x{A3C}|[\x{A41}-\x{A42}]|[\x{A47}-\x{A48}]|[\x{A4B}-\x{A4D}]|\x{A51}|[\x{A70}-\x{A71}]|\x{A75}|[\x{A81}-\x{A82}]|\x{ABC}|[\x{AC1}-\x{AC5}]|[\x{AC7}-\x{AC8}]|\x{ACD}|[\x{AE2}-\x{AE3}]|\x{B01}|\x{B3C}|[\x{B3E}-\x{B3F}]|[\x{B41}-\x{B44}]|\x{B4D}|[\x{B56}-\x{B57}]|[\x{B62}-\x{B63}]|\x{B82}|\x{BBE}|\x{BC0}|\x{BCD}|\x{BD7}|\x{C00}|[\x{C3E}-\x{C40}]|[\x{C46}-\x{C48}]|[\x{C4A}-\x{C4D}]|[\x{C55}-\x{C56}]|[\x{C62}-\x{C63}]|\x{C81}|\x{CBC}|\x{CBF}|\x{CC2}|\x{CC6}|[\x{CCC}-\x{CCD}]|[\x{CD5}-\x{CD6}]|[\x{CE2}-\x{CE3}]|\x{D01}|\x{D3E}|[\x{D41}-\x{D44}]|\x{D4D}|\x{D57}|[\x{D62}-\x{D63}]|\x{DCA}|\x{DCF}|[\x{DD2}-\x{DD4}]|\x{DD6}|\x{DDF}|\x{E31}|[\x{E34}-\x{E3A}]|[\x{E47}-\x{E4E}]|\x{EB1}|[\x{EB4}-\x{EB9}]|[\x{EBB}-\x{EBC}]|[\x{EC8}-\x{ECD}]|[\x{F18}-\x{F19}]|\x{F35}|\x{F37}|\x{F39}|[\x{F71}-\x{F7E}]|[\x{F80}-\x{F84}]|[\x{F86}-\x{F87}]|[\x{F8D}-\x{F97}]|[\x{F99}-\x{FBC}]|\x{FC6}|[\x{102D}-\x{1030}]|[\x{1032}-\x{1037}]|[\x{1039}-\x{103A}]|[\x{103D}-\x{103E}]|[\x{1058}-\x{1059}]|[\x{105E}-\x{1060}]|[\x{1071}-\x{1074}]|\x{1082}|[\x{1085}-\x{1086}]|\x{108D}|\x{109D}|[\x{135D}-\x{135F}]|[\x{1712}-\x{1714}]|[\x{1732}-\x{1734}]|[\x{1752}-\x{1753}]|[\x{1772}-\x{1773}]|[\x{17B4}-\x{17B5}]|[\x{17B7}-\x{17BD}]|\x{17C6}|[\x{17C9}-\x{17D3}]|\x{17DD}|[\x{180B}-\x{180D}]|\x{18A9}|[\x{1920}-\x{1922}]|[\x{1927}-\x{1928}]|\x{1932}|[\x{1939}-\x{193B}]|[\x{1A17}-\x{1A18}]|\x{1A1B}|\x{1A56}|[\x{1A58}-\x{1A5E}]|\x{1A60}|\x{1A62}|[\x{1A65}-\x{1A6C}]|[\x{1A73}-\x{1A7C}]|\x{1A7F}|[\x{1AB0}-\x{1ABE}]|[\x{1B00}-\x{1B03}]|\x{1B34}|[\x{1B36}-\x{1B3A}]|\x{1B3C}|\x{1B42}|[\x{1B6B}-\x{1B73}]|[\x{1B80}-\x{1B81}]|[\x{1BA2}-\x{1BA5}]|[\x{1BA8}-\x{1BA9}]|[\x{1BAB}-\x{1BAD}]|\x{1BE6}|[\x{1BE8}-\x{1BE9}]|\x{1BED}|[\x{1BEF}-\x{1BF1}]|[\x{1C2C}-\x{1C33}]|[\x{1C36}-\x{1C37}]|[\x{1CD0}-\x{1CD2}]|[\x{1CD4}-\x{1CE0}]|[\x{1CE2}-\x{1CE8}]|\x{1CED}|\x{1CF4}|[\x{1CF8}-\x{1CF9}]|[\x{1DC0}-\x{1DF5}]|[\x{1DFC}-\x{1DFF}]|[\x{200C}-\x{200D}]|[\x{20D0}-\x{20F0}]|[\x{2CEF}-\x{2CF1}]|\x{2D7F}|[\x{2DE0}-\x{2DFF}]|[\x{302A}-\x{302F}]|[\x{3099}-\x{309A}]|[\x{A66F}-\x{A672}]|[\x{A674}-\x{A67D}]|\x{A69F}|[\x{A6F0}-\x{A6F1}]|\x{A802}|\x{A806}|\x{A80B}|[\x{A825}-\x{A826}]|\x{A8C4}|[\x{A8E0}-\x{A8F1}]|[\x{A926}-\x{A92D}]|[\x{A947}-\x{A951}]|[\x{A980}-\x{A982}]|\x{A9B3}|[\x{A9B6}-\x{A9B9}]|\x{A9BC}|\x{A9E5}|[\x{AA29}-\x{AA2E}]|[\x{AA31}-\x{AA32}]|[\x{AA35}-\x{AA36}]|\x{AA43}|\x{AA4C}|\x{AA7C}|\x{AAB0}|[\x{AAB2}-\x{AAB4}]|[\x{AAB7}-\x{AAB8}]|[\x{AABE}-\x{AABF}]|\x{AAC1}|[\x{AAEC}-\x{AAED}]|\x{AAF6}|\x{ABE5}|\x{ABE8}|\x{ABED}|\x{FB1E}|[\x{FE00}-\x{FE0F}]|[\x{FE20}-\x{FE2D}]|[\x{FF9E}-\x{FF9F}]|\x{101FD}|\x{102E0}|[\x{10376}-\x{1037A}]|[\x{10A01}-\x{10A03}]|[\x{10A05}-\x{10A06}]|[\x{10A0C}-\x{10A0F}]|[\x{10A38}-\x{10A3A}]|\x{10A3F}|[\x{10AE5}-\x{10AE6}]|\x{11001}|[\x{11038}-\x{11046}]|[\x{1107F}-\x{11081}]|[\x{110B3}-\x{110B6}]|[\x{110B9}-\x{110BA}]|[\x{11100}-\x{11102}]|[\x{11127}-\x{1112B}]|[\x{1112D}-\x{11134}]|\x{11173}|[\x{11180}-\x{11181}]|[\x{111B6}-\x{111BE}]|[\x{1122F}-\x{11231}]|\x{11234}|[\x{11236}-\x{11237}]|\x{112DF}|[\x{112E3}-\x{112EA}]|\x{11301}|\x{1133C}|\x{1133E}|\x{11340}|\x{11357}|[\x{11366}-\x{1136C}]|[\x{11370}-\x{11374}]|\x{114B0}|[\x{114B3}-\x{114B8}]|\x{114BA}|\x{114BD}|[\x{114BF}-\x{114C0}]|[\x{114C2}-\x{114C3}]|\x{115AF}|[\x{115B2}-\x{115B5}]|[\x{115BC}-\x{115BD}]|[\x{115BF}-\x{115C0}]|[\x{11633}-\x{1163A}]|\x{1163D}|[\x{1163F}-\x{11640}]|\x{116AB}|\x{116AD}|[\x{116B0}-\x{116B5}]|\x{116B7}|[\x{16AF0}-\x{16AF4}]|[\x{16B30}-\x{16B36}]|[\x{16F8F}-\x{16F92}]|[\x{1BC9D}-\x{1BC9E}]|\x{1D165}|[\x{1D167}-\x{1D169}]|[\x{1D16E}-\x{1D172}]|[\x{1D17B}-\x{1D182}]|[\x{1D185}-\x{1D18B}]|[\x{1D1AA}-\x{1D1AD}]|[\x{1D242}-\x{1D244}]|[\x{1E8D0}-\x{1E8D6}]|[\x{E0100}-\x{E01EF}]/u',
'regional_indicator' => '/[\x{1F1E6}-\x{1F1FF}]/u',
'spacingmark' => '/\x{903}|\x{93B}|[\x{93E}-\x{940}]|[\x{949}-\x{94C}]|[\x{94E}-\x{94F}]|[\x{982}-\x{983}]|[\x{9BF}-\x{9C0}]|[\x{9C7}-\x{9C8}]|[\x{9CB}-\x{9CC}]|\x{A03}|[\x{A3E}-\x{A40}]|\x{A83}|[\x{ABE}-\x{AC0}]|\x{AC9}|[\x{ACB}-\x{ACC}]|[\x{B02}-\x{B03}]|\x{B40}|[\x{B47}-\x{B48}]|[\x{B4B}-\x{B4C}]|\x{BBF}|[\x{BC1}-\x{BC2}]|[\x{BC6}-\x{BC8}]|[\x{BCA}-\x{BCC}]|[\x{C01}-\x{C03}]|[\x{C41}-\x{C44}]|[\x{C82}-\x{C83}]|\x{CBE}|[\x{CC0}-\x{CC1}]|[\x{CC3}-\x{CC4}]|[\x{CC7}-\x{CC8}]|[\x{CCA}-\x{CCB}]|[\x{D02}-\x{D03}]|[\x{D3F}-\x{D40}]|[\x{D46}-\x{D48}]|[\x{D4A}-\x{D4C}]|[\x{D82}-\x{D83}]|[\x{DD0}-\x{DD1}]|[\x{DD8}-\x{DDE}]|[\x{DF2}-\x{DF3}]|\x{E33}|\x{EB3}|[\x{F3E}-\x{F3F}]|\x{F7F}|\x{1031}|[\x{103B}-\x{103C}]|[\x{1056}-\x{1057}]|\x{1084}|\x{17B6}|[\x{17BE}-\x{17C5}]|[\x{17C7}-\x{17C8}]|[\x{1923}-\x{1926}]|[\x{1929}-\x{192B}]|[\x{1930}-\x{1931}]|[\x{1933}-\x{1938}]|[\x{19B5}-\x{19B7}]|\x{19BA}|[\x{1A19}-\x{1A1A}]|\x{1A55}|\x{1A57}|[\x{1A6D}-\x{1A72}]|\x{1B04}|\x{1B35}|\x{1B3B}|[\x{1B3D}-\x{1B41}]|[\x{1B43}-\x{1B44}]|\x{1B82}|\x{1BA1}|[\x{1BA6}-\x{1BA7}]|\x{1BAA}|\x{1BE7}|[\x{1BEA}-\x{1BEC}]|\x{1BEE}|[\x{1BF2}-\x{1BF3}]|[\x{1C24}-\x{1C2B}]|[\x{1C34}-\x{1C35}]|\x{1CE1}|[\x{1CF2}-\x{1CF3}]|[\x{A823}-\x{A824}]|\x{A827}|[\x{A880}-\x{A881}]|[\x{A8B4}-\x{A8C3}]|[\x{A952}-\x{A953}]|\x{A983}|[\x{A9B4}-\x{A9B5}]|[\x{A9BA}-\x{A9BB}]|[\x{A9BD}-\x{A9C0}]|[\x{AA2F}-\x{AA30}]|[\x{AA33}-\x{AA34}]|\x{AA4D}|\x{AAEB}|[\x{AAEE}-\x{AAEF}]|\x{AAF5}|[\x{ABE3}-\x{ABE4}]|[\x{ABE6}-\x{ABE7}]|[\x{ABE9}-\x{ABEA}]|\x{ABEC}|\x{11000}|\x{11002}|\x{11082}|[\x{110B0}-\x{110B2}]|[\x{110B7}-\x{110B8}]|\x{1112C}|\x{11182}|[\x{111B3}-\x{111B5}]|[\x{111BF}-\x{111C0}]|[\x{1122C}-\x{1122E}]|[\x{11232}-\x{11233}]|\x{11235}|[\x{112E0}-\x{112E2}]|[\x{11302}-\x{11303}]|\x{1133F}|[\x{11341}-\x{11344}]|[\x{11347}-\x{11348}]|[\x{1134B}-\x{1134D}]|[\x{11362}-\x{11363}]|[\x{114B1}-\x{114B2}]|\x{114B9}|[\x{114BB}-\x{114BC}]|\x{114BE}|\x{114C1}|[\x{115B0}-\x{115B1}]|[\x{115B8}-\x{115BB}]|\x{115BE}|[\x{11630}-\x{11632}]|[\x{1163B}-\x{1163C}]|\x{1163E}|\x{116AC}|[\x{116AE}-\x{116AF}]|\x{116B6}|[\x{16F51}-\x{16F7E}]|\x{1D166}|\x{1D16D}/u',
'l' => '/[\x{1100}-\x{115F}]|[\x{A960}-\x{A97C}]/u',
'v' => '/[\x{1160}-\x{11A7}]|[\x{D7B0}-\x{D7C6}]/u',
't' => '/[\x{11A8}-\x{11FF}]|[\x{D7CB}-\x{D7FB}]/u',
'lv' => '/\x{AC00}|\x{AC1C}|\x{AC38}|\x{AC54}|\x{AC70}|\x{AC8C}|\x{ACA8}|\x{ACC4}|\x{ACE0}|\x{ACFC}|\x{AD18}|\x{AD34}|\x{AD50}|\x{AD6C}|\x{AD88}|\x{ADA4}|\x{ADC0}|\x{ADDC}|\x{ADF8}|\x{AE14}|\x{AE30}|\x{AE4C}|\x{AE68}|\x{AE84}|\x{AEA0}|\x{AEBC}|\x{AED8}|\x{AEF4}|\x{AF10}|\x{AF2C}|\x{AF48}|\x{AF64}|\x{AF80}|\x{AF9C}|\x{AFB8}|\x{AFD4}|\x{AFF0}|\x{B00C}|\x{B028}|\x{B044}|\x{B060}|\x{B07C}|\x{B098}|\x{B0B4}|\x{B0D0}|\x{B0EC}|\x{B108}|\x{B124}|\x{B140}|\x{B15C}|\x{B178}|\x{B194}|\x{B1B0}|\x{B1CC}|\x{B1E8}|\x{B204}|\x{B220}|\x{B23C}|\x{B258}|\x{B274}|\x{B290}|\x{B2AC}|\x{B2C8}|\x{B2E4}|\x{B300}|\x{B31C}|\x{B338}|\x{B354}|\x{B370}|\x{B38C}|\x{B3A8}|\x{B3C4}|\x{B3E0}|\x{B3FC}|\x{B418}|\x{B434}|\x{B450}|\x{B46C}|\x{B488}|\x{B4A4}|\x{B4C0}|\x{B4DC}|\x{B4F8}|\x{B514}|\x{B530}|\x{B54C}|\x{B568}|\x{B584}|\x{B5A0}|\x{B5BC}|\x{B5D8}|\x{B5F4}|\x{B610}|\x{B62C}|\x{B648}|\x{B664}|\x{B680}|\x{B69C}|\x{B6B8}|\x{B6D4}|\x{B6F0}|\x{B70C}|\x{B728}|\x{B744}|\x{B760}|\x{B77C}|\x{B798}|\x{B7B4}|\x{B7D0}|\x{B7EC}|\x{B808}|\x{B824}|\x{B840}|\x{B85C}|\x{B878}|\x{B894}|\x{B8B0}|\x{B8CC}|\x{B8E8}|\x{B904}|\x{B920}|\x{B93C}|\x{B958}|\x{B974}|\x{B990}|\x{B9AC}|\x{B9C8}|\x{B9E4}|\x{BA00}|\x{BA1C}|\x{BA38}|\x{BA54}|\x{BA70}|\x{BA8C}|\x{BAA8}|\x{BAC4}|\x{BAE0}|\x{BAFC}|\x{BB18}|\x{BB34}|\x{BB50}|\x{BB6C}|\x{BB88}|\x{BBA4}|\x{BBC0}|\x{BBDC}|\x{BBF8}|\x{BC14}|\x{BC30}|\x{BC4C}|\x{BC68}|\x{BC84}|\x{BCA0}|\x{BCBC}|\x{BCD8}|\x{BCF4}|\x{BD10}|\x{BD2C}|\x{BD48}|\x{BD64}|\x{BD80}|\x{BD9C}|\x{BDB8}|\x{BDD4}|\x{BDF0}|\x{BE0C}|\x{BE28}|\x{BE44}|\x{BE60}|\x{BE7C}|\x{BE98}|\x{BEB4}|\x{BED0}|\x{BEEC}|\x{BF08}|\x{BF24}|\x{BF40}|\x{BF5C}|\x{BF78}|\x{BF94}|\x{BFB0}|\x{BFCC}|\x{BFE8}|\x{C004}|\x{C020}|\x{C03C}|\x{C058}|\x{C074}|\x{C090}|\x{C0AC}|\x{C0C8}|\x{C0E4}|\x{C100}|\x{C11C}|\x{C138}|\x{C154}|\x{C170}|\x{C18C}|\x{C1A8}|\x{C1C4}|\x{C1E0}|\x{C1FC}|\x{C218}|\x{C234}|\x{C250}|\x{C26C}|\x{C288}|\x{C2A4}|\x{C2C0}|\x{C2DC}|\x{C2F8}|\x{C314}|\x{C330}|\x{C34C}|\x{C368}|\x{C384}|\x{C3A0}|\x{C3BC}|\x{C3D8}|\x{C3F4}|\x{C410}|\x{C42C}|\x{C448}|\x{C464}|\x{C480}|\x{C49C}|\x{C4B8}|\x{C4D4}|\x{C4F0}|\x{C50C}|\x{C528}|\x{C544}|\x{C560}|\x{C57C}|\x{C598}|\x{C5B4}|\x{C5D0}|\x{C5EC}|\x{C608}|\x{C624}|\x{C640}|\x{C65C}|\x{C678}|\x{C694}|\x{C6B0}|\x{C6CC}|\x{C6E8}|\x{C704}|\x{C720}|\x{C73C}|\x{C758}|\x{C774}|\x{C790}|\x{C7AC}|\x{C7C8}|\x{C7E4}|\x{C800}|\x{C81C}|\x{C838}|\x{C854}|\x{C870}|\x{C88C}|\x{C8A8}|\x{C8C4}|\x{C8E0}|\x{C8FC}|\x{C918}|\x{C934}|\x{C950}|\x{C96C}|\x{C988}|\x{C9A4}|\x{C9C0}|\x{C9DC}|\x{C9F8}|\x{CA14}|\x{CA30}|\x{CA4C}|\x{CA68}|\x{CA84}|\x{CAA0}|\x{CABC}|\x{CAD8}|\x{CAF4}|\x{CB10}|\x{CB2C}|\x{CB48}|\x{CB64}|\x{CB80}|\x{CB9C}|\x{CBB8}|\x{CBD4}|\x{CBF0}|\x{CC0C}|\x{CC28}|\x{CC44}|\x{CC60}|\x{CC7C}|\x{CC98}|\x{CCB4}|\x{CCD0}|\x{CCEC}|\x{CD08}|\x{CD24}|\x{CD40}|\x{CD5C}|\x{CD78}|\x{CD94}|\x{CDB0}|\x{CDCC}|\x{CDE8}|\x{CE04}|\x{CE20}|\x{CE3C}|\x{CE58}|\x{CE74}|\x{CE90}|\x{CEAC}|\x{CEC8}|\x{CEE4}|\x{CF00}|\x{CF1C}|\x{CF38}|\x{CF54}|\x{CF70}|\x{CF8C}|\x{CFA8}|\x{CFC4}|\x{CFE0}|\x{CFFC}|\x{D018}|\x{D034}|\x{D050}|\x{D06C}|\x{D088}|\x{D0A4}|\x{D0C0}|\x{D0DC}|\x{D0F8}|\x{D114}|\x{D130}|\x{D14C}|\x{D168}|\x{D184}|\x{D1A0}|\x{D1BC}|\x{D1D8}|\x{D1F4}|\x{D210}|\x{D22C}|\x{D248}|\x{D264}|\x{D280}|\x{D29C}|\x{D2B8}|\x{D2D4}|\x{D2F0}|\x{D30C}|\x{D328}|\x{D344}|\x{D360}|\x{D37C}|\x{D398}|\x{D3B4}|\x{D3D0}|\x{D3EC}|\x{D408}|\x{D424}|\x{D440}|\x{D45C}|\x{D478}|\x{D494}|\x{D4B0}|\x{D4CC}|\x{D4E8}|\x{D504}|\x{D520}|\x{D53C}|\x{D558}|\x{D574}|\x{D590}|\x{D5AC}|\x{D5C8}|\x{D5E4}|\x{D600}|\x{D61C}|\x{D638}|\x{D654}|\x{D670}|\x{D68C}|\x{D6A8}|\x{D6C4}|\x{D6E0}|\x{D6FC}|\x{D718}|\x{D734}|\x{D750}|\x{D76C}|\x{D788}/u'
];
foreach ($classes as $class) {
if (isset($regex[$class]) && preg_match($regex[$class], $char)) {
return true;
}
}
return false;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment