Skip to content

Instantly share code, notes, and snippets.

@michaelbutler
Created December 15, 2021 22:05
Show Gist options
  • Save michaelbutler/a3176c4d14a6ec357d9b1ce9ce8b8b92 to your computer and use it in GitHub Desktop.
Save michaelbutler/a3176c4d14a6ec357d9b1ce9ce8b8b92 to your computer and use it in GitHub Desktop.
Handle confusable strings in PHP
<?php
$confusables = [
'a' => '(@|⍺|a|𝐚|𝑎|𝒂|𝒶|𝓪|𝔞|𝕒|𝖆|𝖺|𝗮|𝘢|𝙖|𝚊|ɑ|α|𝛂|𝛼|𝜶|𝝰|𝞪|а|A|𝐀|𝐴|𝑨|𝒜|𝓐|𝔄|𝔸|𝕬|𝖠|𝗔|𝘈|𝘼|𝙰|Α|𝚨|𝛢|𝜜|𝝖|𝞐|А|Ꭺ|ᗅ|ꓮ|𖽀|𐊠)',
'b' => '(𝐛|𝑏|𝒃|𝒷|𝓫|𝔟|𝕓|𝖇|𝖻|𝗯|𝘣|𝙗|𝚋|Ƅ|Ь|Ꮟ|ᑲ|ᖯ|B|ℬ|𝐁|𝐵|𝑩|𝓑|𝔅|𝔹|𝕭|𝖡|𝗕|𝘉|𝘽|𝙱|Ꞵ|Β|𝚩|𝛣|𝜝|𝝗|𝞑|В|Ᏼ|ᗷ|ꓐ|𐊂|𐊡|𐌁)',
'c' => '(c|ⅽ|𝐜|𝑐|𝒄|𝒸|𝓬|𝔠|𝕔|𝖈|𝖼|𝗰|𝘤|𝙘|𝚌|ᴄ|ϲ|ⲥ|с|ꮯ|𐐽|🝌|𑣲|𑣩|C|Ⅽ|ℂ|ℭ|𝐂|𝐶|𝑪|𝒞|𝓒|𝕮|𝖢|𝗖|𝘊|𝘾|𝙲|Ϲ|Ⲥ|С|Ꮯ|ꓚ|𐊢|𐌂|𐐕|𐔜)',
'd' => '(ⅾ|ⅆ|𝐝|𝑑|𝒅|𝒹|𝓭|𝔡|𝕕|𝖉|𝖽|𝗱|𝘥|𝙙|𝚍|ԁ|Ꮷ|ᑯ|ꓒ|Ⅾ|ⅅ|𝐃|𝐷|𝑫|𝒟|𝓓|𝔇|𝔻|𝕯|𝖣|𝗗|𝘋|𝘿|𝙳|Ꭰ|ᗞ|ᗪ|ꓓ)',
'e' => '(℮|e|ℯ|ⅇ|𝐞|𝑒|𝒆|𝓮|𝔢|𝕖|𝖊|𝖾|𝗲|𝘦|𝙚|𝚎|ꬲ|е|ҽ|⋿|E|ℰ|𝐄|𝐸|𝑬|𝓔|𝔈|𝔼|𝕰|𝖤|𝗘|𝘌|𝙀|𝙴|Ε|𝚬|𝛦|𝜠|𝝚|𝞔|Е|ⴹ|Ꭼ|ꓰ|𑢦|𑢮|𐊆)',
'f' => '(𝐟|𝑓|𝒇|𝒻|𝓯|𝔣|𝕗|𝖋|𝖿|𝗳|𝘧|𝙛|𝚏|ꬵ|ꞙ|ſ|ẝ|ք|𝈓|ℱ|𝐅|𝐹|𝑭|𝓕|𝔉|𝔽|𝕱|𝖥|𝗙|𝘍|𝙁|𝙵|Ꞙ|Ϝ|𝟊|ᖴ|ꓝ|𑣂|𑢢|𐊇|𐊥|𐔥)',
'g' => '(g|ℊ|𝐠|𝑔|𝒈|𝓰|𝔤|𝕘|𝖌|𝗀|𝗴|𝘨|𝙜|𝚐|ɡ|ᶃ|ƍ|ց|𝐆|𝐺|𝑮|𝒢|𝓖|𝔊|𝔾|𝕲|𝖦|𝗚|𝘎|𝙂|𝙶|Ԍ|Ꮐ|Ᏻ|ꓖ)',
'h' => '(h|ℎ|𝐡|𝒉|𝒽|𝓱|𝔥|𝕙|𝖍|𝗁|𝗵|𝘩|𝙝|𝚑|һ|հ|Ꮒ|H|ℋ|ℌ|ℍ|𝐇|𝐻|𝑯|𝓗|𝕳|𝖧|𝗛|𝘏|𝙃|𝙷|Η|𝚮|𝛨|𝜢|𝝜|𝞖|Ⲏ|Н|Ꮋ|ᕼ|ꓧ|𐋏)',
'i' => '(˛|⍳|i|ⅰ|ℹ|ⅈ|𝐢|𝑖|𝒊|𝒾|𝓲|𝔦|𝕚|𝖎|𝗂|𝗶|𝘪|𝙞|𝚒|𝚤|ɪ|ɩ|ι|ι|ͺ|𝛊|𝜄|𝜾|𝝸|𝞲|і|ꙇ|ӏ|ꭵ|Ꭵ|𑣃)',
'j' => '(j|ⅉ|𝐣|𝑗|𝒋|𝒿|𝓳|𝔧|𝕛|𝖏|𝗃|𝗷|𝘫|𝙟|𝚓|ϳ|ј|J|𝐉|𝐽|𝑱|𝒥|𝓙|𝔍|𝕁|𝕵|𝖩|𝗝|𝘑|𝙅|𝙹|Ʝ|Ϳ|Ј|Ꭻ|ᒍ|ꓙ)',
'k' => '(𝐤|𝑘|𝒌|𝓀|𝓴|𝔨|𝕜|𝖐|𝗄|𝗸|𝘬|𝙠|𝚔|K|K|𝐊|𝐾|𝑲|𝒦|𝓚|𝔎|𝕂|𝕶|𝖪|𝗞|𝘒|𝙆|𝙺|Κ|𝚱|𝛫|𝜥|𝝟|𝞙|Ⲕ|К|Ꮶ|ᛕ|ꓗ|𐔘)',
'l' => '(Ɩ|ǀ|Ι|І|Ӏ|׀|ו|ן|ا|١|۱|ߊ|ᛁ|ℐ|ℑ|ℓ|Ⅰ|ⅼ|∣|⏽|Ⲓ|ⵏ|ꓲ|𐊊|𐌉|𐌠|𖼨|𝐈|𝐥|𝐼|𝑙|𝑰|𝒍|𝓁|𝓘|𝓵|𝔩|𝕀|𝕝|𝕴|𝖑|𝖨|𝗅|𝗜|𝗹|𝘐|𝘭|𝙄|𝙡|𝙸|𝚕|𝚰|𝛪|𝜤|𝝞|𝞘|𝟏|𝟙|𝟣|𝟭|𝟷|𞣇|𞸀|𞺀|🯱|ﺍ|ﺎ|I|l|│)',
'm' => '(ⅿ|𑜀|𑣣|𝐦|𝑚|𝒎|𝓂|𝓶|𝔪|𝕞|𝖒|𝗆|𝗺|𝘮|𝙢|𝚖|Μ|Ϻ|М|Ꮇ|ᗰ|ᛖ|ℳ|Ⅿ|Ⲙ|ꓟ|𐊰|𐌑|𝐌|𝑀|𝑴|𝓜|𝔐|𝕄|𝕸|𝖬|𝗠|𝘔|𝙈|𝙼|𝚳|𝛭|𝜧|𝝡|𝞛|M)',
'n' => '(𝐧|𝑛|𝒏|𝓃|𝓷|𝔫|𝕟|𝖓|𝗇|𝗻|𝘯|𝙣|𝚗|ո|ռ|N|ℕ|𝐍|𝑁|𝑵|𝒩|𝓝|𝔑|𝕹|𝖭|𝗡|𝘕|𝙉|𝙽|Ν|𝚴|𝛮|𝜨|𝝢|𝞜|Ⲛ|ꓠ|𐔓)',
'o' => '(ం|ಂ|ം|ං|०|੦|૦|௦|౦|೦|൦|๐|໐|၀|‎٥‎|۵|o|ℴ|𝐨|𝑜|𝒐|𝓸|𝔬|𝕠|𝖔|𝗈|𝗼|𝘰|𝙤|𝚘|ᴏ|ᴑ|ꬽ|ο|𝛐|𝜊|𝝄|𝝾|𝞸|σ|𝛔|𝜎|𝝈|𝞂|𝞼|ⲟ|о|ჿ|օ|‎ס‎|‎ه‎|‎𞸤‎|‎𞹤‎|‎𞺄‎|‎ﻫ‎|‎ﻬ‎|‎ﻪ‎|‎ﻩ‎|‎ھ‎|‎ﮬ‎|‎ﮭ‎|‎ﮫ‎|‎ﮪ‎|‎ہ‎|‎ﮨ‎|‎ﮩ‎|‎ﮧ‎|‎ﮦ‎|‎ە‎|ഠ|ဝ|𐓪|𑣈|𑣗|𐐬|0|‎߀‎|০|୦|〇|𑓐|𑣠|𝟎|𝟘|𝟢|𝟬|𝟶|O|𝐎|𝑂|𝑶|𝒪|𝓞|𝔒|𝕆|𝕺|𝖮|𝗢|𝘖|𝙊|𝙾|Ο|𝚶|𝛰|𝜪|𝝤|𝞞|Ⲟ|О|Օ|ⵔ|ዐ|ଠ|𐓂|ꓳ|𑢵|𐊒|𐊫|𐐄|𐔖)',
'p' => '(⍴|p|𝐩|𝑝|𝒑|𝓅|𝓹|𝔭|𝕡|𝖕|𝗉|𝗽|𝘱|𝙥|𝚙|ρ|ϱ|𝛒|𝛠|𝜌|𝜚|𝝆|𝝔|𝞀|𝞎|𝞺|𝟈|ⲣ|р|P|ℙ|𝐏|𝑃|𝑷|𝒫|𝓟|𝔓|𝕻|𝖯|𝗣|𝘗|𝙋|𝙿|Ρ|𝚸|𝛲|𝜬|𝝦|𝞠|Ⲣ|Р|Ꮲ|ᑭ|ꓑ|𐊕)',
'q' => '(𝐪|𝑞|𝒒|𝓆|𝓺|𝔮|𝕢|𝖖|𝗊|𝗾|𝘲|𝙦|𝚚|ԛ|գ|զ|ℚ|𝐐|𝑄|𝑸|𝒬|𝓠|𝔔|𝕼|𝖰|𝗤|𝘘|𝙌|𝚀|ⵕ)',
'r' => '(𝐫|𝑟|𝒓|𝓇|𝓻|𝔯|𝕣|𝖗|𝗋|𝗿|𝘳|𝙧|𝚛|ꭇ|ꭈ|ᴦ|ⲅ|г|ꮁ|𝈖|ℛ|ℜ|ℝ|𝐑|𝑅|𝑹|𝓡|𝕽|𝖱|𝗥|𝘙|𝙍|𝚁|Ʀ|Ꭱ|Ꮢ|𐒴|ᖇ|ꓣ|𖼵)',
's' => '(s|𝐬|𝑠|𝒔|𝓈|𝓼|𝔰|𝕤|𝖘|𝗌|𝘀|𝘴|𝙨|𝚜|ꜱ|ƽ|ѕ|ꮪ|𑣁|𐑈|S|𝐒|𝑆|𝑺|𝒮|𝓢|𝔖|𝕊|𝕾|𝖲|𝗦|𝘚|𝙎|𝚂|Ѕ|Տ|Ꮥ|Ꮪ|ꓢ|𖼺|𐊖|𐐠)',
't' => '(𝐭|𝑡|𝒕|𝓉|𝓽|𝔱|𝕥|𝖙|𝗍|𝘁|𝘵|𝙩|𝚝|⊤|⟙|🝨|T|𝐓|𝑇|𝑻|𝒯|𝓣|𝔗|𝕋|𝕿|𝖳|𝗧|𝘛|𝙏|𝚃|Τ|𝚻|𝛵|𝜯|𝝩|𝞣|Ⲧ|Т|Ꭲ|ꓔ|𖼊|𑢼|𐊗|𐊱|𐌕)',
'u' => '(𝐮|𝑢|𝒖|𝓊|𝓾|𝔲|𝕦|𝖚|𝗎|𝘂|𝘶|𝙪|𝚞|ꞟ|ᴜ|ꭎ|ꭒ|ʋ|υ|𝛖|𝜐|𝝊|𝞄|𝞾|ս|𐓶|𑣘|∪|⋃|𝐔|𝑈|𝑼|𝒰|𝓤|𝔘|𝕌|𝖀|𝖴|𝗨|𝘜|𝙐|𝚄|Ս|ሀ|𐓎|ᑌ|ꓴ|𖽂|𑢸)',
'v' => '(∨|⋁|v|ⅴ|𝐯|𝑣|𝒗|𝓋|𝓿|𝔳|𝕧|𝖛|𝗏|𝘃|𝘷|𝙫|𝚟|ᴠ|ν|𝛎|𝜈|𝝂|𝝼|𝞶|ѵ|‎ט‎|𑜆|ꮩ|𑣀|𝈍|‎٧‎|۷|Ⅴ|𝐕|𝑉|𝑽|𝒱|𝓥|𝔙|𝕍|𝖁|𝖵|𝗩|𝘝|𝙑|𝚅|Ѵ|ⴸ|Ꮩ|ᐯ|ꛟ|ꓦ|𖼈|𑢠|𐔝)',
'w' => '(ɯ|ѡ|ԝ|ա|ᴡ|ꮃ|𑜊|𑜎|𑜏|𝐰|𝑤|𝒘|𝓌|𝔀|𝔴|𝕨|𝖜|𝗐|𝘄|𝘸|𝙬|𝚠|Ԝ|Ꮃ|Ꮤ|ꓪ|𑣦|𑣯|𝐖|𝑊|𝑾|𝒲|𝓦|𝔚|𝕎|𝖂|𝖶|𝗪|𝘞|𝙒|𝚆)',
'x' => '(᙮|×|⤫|⤬|⨯|x|ⅹ|𝐱|𝑥|𝒙|𝓍|𝔁|𝔵|𝕩|𝖝|𝗑|𝘅|𝘹|𝙭|𝚡|х|ᕁ|ᕽ|᙭|╳|𐌢|𑣬|X|Ⅹ|𝐗|𝑋|𝑿|𝒳|𝓧|𝔛|𝕏|𝖃|𝖷|𝗫|𝘟|𝙓|𝚇|Ꭓ|Χ|𝚾|𝛸|𝜲|𝝬|𝞦|Ⲭ|Х|ⵝ|ᚷ|ꓫ|𐊐|𐊴|𐌗|𐔧)',
'y' => '(ɣ|ᶌ|y|𝐲|𝑦|𝒚|𝓎|𝔂|𝔶|𝕪|𝖞|𝗒|𝘆|𝘺|𝙮|𝚢|ʏ|ỿ|ꭚ|γ|ℽ|𝛄|𝛾|𝜸|𝝲|𝞬|у|ү|ყ|𑣜|Y|𝐘|𝑌|𝒀|𝒴|𝓨|𝔜|𝕐|𝖄|𝖸|𝗬|𝘠|𝙔|𝚈|Υ|ϒ|𝚼|𝛶|𝜰|𝝪|𝞤|Ⲩ|У|Ү|Ꭹ|Ꮍ|ꓬ|𖽃|𑢤|𐊲)',
'z' => '(𝐳|𝑧|𝒛|𝓏|𝔃|𝔷|𝕫|𝖟|𝗓|𝘇|𝘻|𝙯|𝚣|ᴢ|ꮓ|𑣄|𐋵|𑣥|Z|ℤ|ℨ|𝐙|𝑍|𝒁|𝒵|𝓩|𝖅|𝖹|𝗭|𝘡|𝙕|𝚉|Ζ|𝚭|𝛧|𝜡|𝝛|𝞕|Ꮓ|ꓜ|𑢩)',
];
// Input obfuscated string
$string = '𝒇ᴦ℮℮𝐩०𝙧𝕟';
$string = mb_strtolower($string, 'UTF-8');
// Fairly intensive technique to convert an obfuscated string back into plain ASCII
foreach ($confusables as $replacement => $regex) {
$string = preg_replace("~$regex~u", $replacement, $string);
}
echo $string . "\n"; // outputs "freeporn"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment