summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--www/gpg.php419
1 files changed, 418 insertions, 1 deletions
diff --git a/www/gpg.php b/www/gpg.php
index ca376b8..4cfe1e5 100644
--- a/www/gpg.php
+++ b/www/gpg.php
@@ -60,11 +60,421 @@ if(0)
}
function normalizeName($name) {
- $name = sanitizeHTML($name);
+ // Based on http://stackoverflow.com/questions/11176752/converting-named-html-entities-to-numeric-html-entities
+ static $HTML401NamedToNumeric = array(
+ //HTML 4.01 standard
+ ' ' => ' ', # no-break space = non-breaking space, U+00A0 ISOnum
+ '¡' => '¡', # inverted exclamation mark, U+00A1 ISOnum
+ '¢' => '¢', # cent sign, U+00A2 ISOnum
+ '£' => '£', # pound sign, U+00A3 ISOnum
+ '¤' => '¤', # currency sign, U+00A4 ISOnum
+ '¥' => '¥', # yen sign = yuan sign, U+00A5 ISOnum
+ '¦' => '¦', # broken bar = broken vertical bar, U+00A6 ISOnum
+ '§' => '§', # section sign, U+00A7 ISOnum
+ '¨' => '¨', # diaeresis = spacing diaeresis, U+00A8 ISOdia
+ '©' => '©', # copyright sign, U+00A9 ISOnum
+ 'ª' => 'ª', # feminine ordinal indicator, U+00AA ISOnum
+ '«' => '«', # left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum
+ '¬' => '¬', # not sign, U+00AC ISOnum
+ '­' => '­', # soft hyphen = discretionary hyphen, U+00AD ISOnum
+ '®' => '®', # registered sign = registered trade mark sign, U+00AE ISOnum
+ '¯' => '¯', # macron = spacing macron = overline = APL overbar, U+00AF ISOdia
+ '°' => '°', # degree sign, U+00B0 ISOnum
+ '±' => '±', # plus-minus sign = plus-or-minus sign, U+00B1 ISOnum
+ '²' => '²', # superscript two = superscript digit two = squared, U+00B2 ISOnum
+ '³' => '³', # superscript three = superscript digit three = cubed, U+00B3 ISOnum
+ '´' => '´', # acute accent = spacing acute, U+00B4 ISOdia
+ 'µ' => 'µ', # micro sign, U+00B5 ISOnum
+ '¶' => '¶', # pilcrow sign = paragraph sign, U+00B6 ISOnum
+ '·' => '·', # middle dot = Georgian comma = Greek middle dot, U+00B7 ISOnum
+ '¸' => '¸', # cedilla = spacing cedilla, U+00B8 ISOdia
+ '¹' => '¹', # superscript one = superscript digit one, U+00B9 ISOnum
+ 'º' => 'º', # masculine ordinal indicator, U+00BA ISOnum
+ '»' => '»', # right-pointing double angle quotation mark = right pointing guillemet, U+00BB ISOnum
+ '¼' => '¼', # vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum
+ '½' => '½', # vulgar fraction one half = fraction one half, U+00BD ISOnum
+ '¾' => '¾', # vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum
+ '¿' => '¿', # inverted question mark = turned question mark, U+00BF ISOnum
+ 'À' => 'À', # latin capital letter A with grave = latin capital letter A grave, U+00C0 ISOlat1
+ 'Á' => 'Á', # latin capital letter A with acute, U+00C1 ISOlat1
+ 'Â' => 'Â', # latin capital letter A with circumflex, U+00C2 ISOlat1
+ 'Ã' => 'Ã', # latin capital letter A with tilde, U+00C3 ISOlat1
+ 'Ä' => 'Ä', # latin capital letter A with diaeresis, U+00C4 ISOlat1
+ 'Å' => 'Å', # latin capital letter A with ring above = latin capital letter A ring, U+00C5 ISOlat1
+ 'Æ' => 'Æ', # latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1
+ 'Ç' => 'Ç', # latin capital letter C with cedilla, U+00C7 ISOlat1
+ 'È' => 'È', # latin capital letter E with grave, U+00C8 ISOlat1
+ 'É' => 'É', # latin capital letter E with acute, U+00C9 ISOlat1
+ 'Ê' => 'Ê', # latin capital letter E with circumflex, U+00CA ISOlat1
+ 'Ë' => 'Ë', # latin capital letter E with diaeresis, U+00CB ISOlat1
+ 'Ì' => 'Ì', # latin capital letter I with grave, U+00CC ISOlat1
+ 'Í' => 'Í', # latin capital letter I with acute, U+00CD ISOlat1
+ 'Î' => 'Î', # latin capital letter I with circumflex, U+00CE ISOlat1
+ 'Ï' => 'Ï', # latin capital letter I with diaeresis, U+00CF ISOlat1
+ 'Ð' => 'Ð', # latin capital letter ETH, U+00D0 ISOlat1
+ 'Ñ' => 'Ñ', # latin capital letter N with tilde, U+00D1 ISOlat1
+ 'Ò' => 'Ò', # latin capital letter O with grave, U+00D2 ISOlat1
+ 'Ó' => 'Ó', # latin capital letter O with acute, U+00D3 ISOlat1
+ 'Ô' => 'Ô', # latin capital letter O with circumflex, U+00D4 ISOlat1
+ 'Õ' => 'Õ', # latin capital letter O with tilde, U+00D5 ISOlat1
+ 'Ö' => 'Ö', # latin capital letter O with diaeresis, U+00D6 ISOlat1
+ '×' => '×', # multiplication sign, U+00D7 ISOnum
+ 'Ø' => 'Ø', # latin capital letter O with stroke = latin capital letter O slash, U+00D8 ISOlat1
+ 'Ù' => 'Ù', # latin capital letter U with grave, U+00D9 ISOlat1
+ 'Ú' => 'Ú', # latin capital letter U with acute, U+00DA ISOlat1
+ 'Û' => 'Û', # latin capital letter U with circumflex, U+00DB ISOlat1
+ 'Ü' => 'Ü', # latin capital letter U with diaeresis, U+00DC ISOlat1
+ 'Ý' => 'Ý', # latin capital letter Y with acute, U+00DD ISOlat1
+ 'Þ' => 'Þ', # latin capital letter THORN, U+00DE ISOlat1
+ 'ß' => 'ß', # latin small letter sharp s = ess-zed, U+00DF ISOlat1
+ 'à' => 'à', # latin small letter a with grave = latin small letter a grave, U+00E0 ISOlat1
+ 'á' => 'á', # latin small letter a with acute, U+00E1 ISOlat1
+ 'â' => 'â', # latin small letter a with circumflex, U+00E2 ISOlat1
+ 'ã' => 'ã', # latin small letter a with tilde, U+00E3 ISOlat1
+ 'ä' => 'ä', # latin small letter a with diaeresis, U+00E4 ISOlat1
+ 'å' => 'å', # latin small letter a with ring above = latin small letter a ring, U+00E5 ISOlat1
+ 'æ' => 'æ', # latin small letter ae = latin small ligature ae, U+00E6 ISOlat1
+ 'ç' => 'ç', # latin small letter c with cedilla, U+00E7 ISOlat1
+ 'è' => 'è', # latin small letter e with grave, U+00E8 ISOlat1
+ 'é' => 'é', # latin small letter e with acute, U+00E9 ISOlat1
+ 'ê' => 'ê', # latin small letter e with circumflex, U+00EA ISOlat1
+ 'ë' => 'ë', # latin small letter e with diaeresis, U+00EB ISOlat1
+ 'ì' => 'ì', # latin small letter i with grave, U+00EC ISOlat1
+ 'í' => 'í', # latin small letter i with acute, U+00ED ISOlat1
+ 'î' => 'î', # latin small letter i with circumflex, U+00EE ISOlat1
+ 'ï' => 'ï', # latin small letter i with diaeresis, U+00EF ISOlat1
+ 'ð' => 'ð', # latin small letter eth, U+00F0 ISOlat1
+ 'ñ' => 'ñ', # latin small letter n with tilde, U+00F1 ISOlat1
+ 'ò' => 'ò', # latin small letter o with grave, U+00F2 ISOlat1
+ 'ó' => 'ó', # latin small letter o with acute, U+00F3 ISOlat1
+ 'ô' => 'ô', # latin small letter o with circumflex, U+00F4 ISOlat1
+ 'õ' => 'õ', # latin small letter o with tilde, U+00F5 ISOlat1
+ 'ö' => 'ö', # latin small letter o with diaeresis, U+00F6 ISOlat1
+ '÷' => '÷', # division sign, U+00F7 ISOnum
+ 'ø' => 'ø', # latin small letter o with stroke, = latin small letter o slash, U+00F8 ISOlat1
+ 'ù' => 'ù', # latin small letter u with grave, U+00F9 ISOlat1
+ 'ú' => 'ú', # latin small letter u with acute, U+00FA ISOlat1
+ 'û' => 'û', # latin small letter u with circumflex, U+00FB ISOlat1
+ 'ü' => 'ü', # latin small letter u with diaeresis, U+00FC ISOlat1
+ 'ý' => 'ý', # latin small letter y with acute, U+00FD ISOlat1
+ 'þ' => 'þ', # latin small letter thorn, U+00FE ISOlat1
+ 'ÿ' => 'ÿ', # latin small letter y with diaeresis, U+00FF ISOlat1
+ 'ƒ' => 'ƒ', # latin small f with hook = function = florin, U+0192 ISOtech
+ 'Α' => 'Α', # greek capital letter alpha, U+0391
+ 'Β' => 'Β', # greek capital letter beta, U+0392
+ 'Γ' => 'Γ', # greek capital letter gamma, U+0393 ISOgrk3
+ 'Δ' => 'Δ', # greek capital letter delta, U+0394 ISOgrk3
+ 'Ε' => 'Ε', # greek capital letter epsilon, U+0395
+ 'Ζ' => 'Ζ', # greek capital letter zeta, U+0396
+ 'Η' => 'Η', # greek capital letter eta, U+0397
+ 'Θ' => 'Θ', # greek capital letter theta, U+0398 ISOgrk3
+ 'Ι' => 'Ι', # greek capital letter iota, U+0399
+ 'Κ' => 'Κ', # greek capital letter kappa, U+039A
+ 'Λ' => 'Λ', # greek capital letter lambda, U+039B ISOgrk3
+ 'Μ' => 'Μ', # greek capital letter mu, U+039C
+ 'Ν' => 'Ν', # greek capital letter nu, U+039D
+ 'Ξ' => 'Ξ', # greek capital letter xi, U+039E ISOgrk3
+ 'Ο' => 'Ο', # greek capital letter omicron, U+039F
+ 'Π' => 'Π', # greek capital letter pi, U+03A0 ISOgrk3
+ 'Ρ' => 'Ρ', # greek capital letter rho, U+03A1
+ 'Σ' => 'Σ', # greek capital letter sigma, U+03A3 ISOgrk3
+ 'Τ' => 'Τ', # greek capital letter tau, U+03A4
+ 'Υ' => 'Υ', # greek capital letter upsilon, U+03A5 ISOgrk3
+ 'Φ' => 'Φ', # greek capital letter phi, U+03A6 ISOgrk3
+ 'Χ' => 'Χ', # greek capital letter chi, U+03A7
+ 'Ψ' => 'Ψ', # greek capital letter psi, U+03A8 ISOgrk3
+ 'Ω' => 'Ω', # greek capital letter omega, U+03A9 ISOgrk3
+ 'α' => 'α', # greek small letter alpha, U+03B1 ISOgrk3
+ 'β' => 'β', # greek small letter beta, U+03B2 ISOgrk3
+ 'γ' => 'γ', # greek small letter gamma, U+03B3 ISOgrk3
+ 'δ' => 'δ', # greek small letter delta, U+03B4 ISOgrk3
+ 'ε' => 'ε', # greek small letter epsilon, U+03B5 ISOgrk3
+ 'ζ' => 'ζ', # greek small letter zeta, U+03B6 ISOgrk3
+ 'η' => 'η', # greek small letter eta, U+03B7 ISOgrk3
+ 'θ' => 'θ', # greek small letter theta, U+03B8 ISOgrk3
+ 'ι' => 'ι', # greek small letter iota, U+03B9 ISOgrk3
+ 'κ' => 'κ', # greek small letter kappa, U+03BA ISOgrk3
+ 'λ' => 'λ', # greek small letter lambda, U+03BB ISOgrk3
+ 'μ' => 'μ', # greek small letter mu, U+03BC ISOgrk3
+ 'ν' => 'ν', # greek small letter nu, U+03BD ISOgrk3
+ 'ξ' => 'ξ', # greek small letter xi, U+03BE ISOgrk3
+ 'ο' => 'ο', # greek small letter omicron, U+03BF NEW
+ 'π' => 'π', # greek small letter pi, U+03C0 ISOgrk3
+ 'ρ' => 'ρ', # greek small letter rho, U+03C1 ISOgrk3
+ 'ς' => 'ς', # greek small letter final sigma, U+03C2 ISOgrk3
+ 'σ' => 'σ', # greek small letter sigma, U+03C3 ISOgrk3
+ 'τ' => 'τ', # greek small letter tau, U+03C4 ISOgrk3
+ 'υ' => 'υ', # greek small letter upsilon, U+03C5 ISOgrk3
+ 'φ' => 'φ', # greek small letter phi, U+03C6 ISOgrk3
+ 'χ' => 'χ', # greek small letter chi, U+03C7 ISOgrk3
+ 'ψ' => 'ψ', # greek small letter psi, U+03C8 ISOgrk3
+ 'ω' => 'ω', # greek small letter omega, U+03C9 ISOgrk3
+ 'ϑ' => 'ϑ', # greek small letter theta symbol, U+03D1 NEW
+ 'ϒ' => 'ϒ', # greek upsilon with hook symbol, U+03D2 NEW
+ 'ϖ' => 'ϖ', # greek pi symbol, U+03D6 ISOgrk3
+ '•' => '•', # bullet = black small circle, U+2022 ISOpub
+ '…' => '…', # horizontal ellipsis = three dot leader, U+2026 ISOpub
+ '′' => '′', # prime = minutes = feet, U+2032 ISOtech
+ '″' => '″', # double prime = seconds = inches, U+2033 ISOtech
+ '‾' => '‾', # overline = spacing overscore, U+203E NEW
+ '⁄' => '⁄', # fraction slash, U+2044 NEW
+ '℘' => '℘', # script capital P = power set = Weierstrass p, U+2118 ISOamso
+ 'ℑ' => 'ℑ', # blackletter capital I = imaginary part, U+2111 ISOamso
+ 'ℜ' => 'ℜ', # blackletter capital R = real part symbol, U+211C ISOamso
+ '™' => '™', # trade mark sign, U+2122 ISOnum
+ 'ℵ' => 'ℵ', # alef symbol = first transfinite cardinal, U+2135 NEW
+ '←' => '←', # leftwards arrow, U+2190 ISOnum
+ '↑' => '↑', # upwards arrow, U+2191 ISOnum
+ '→' => '→', # rightwards arrow, U+2192 ISOnum
+ '↓' => '↓', # downwards arrow, U+2193 ISOnum
+ '↔' => '↔', # left right arrow, U+2194 ISOamsa
+ '↵' => '↵', # downwards arrow with corner leftwards = carriage return, U+21B5 NEW
+ '⇐' => '⇐', # leftwards double arrow, U+21D0 ISOtech
+ '⇑' => '⇑', # upwards double arrow, U+21D1 ISOamsa
+ '⇒' => '⇒', # rightwards double arrow, U+21D2 ISOtech
+ '⇓' => '⇓', # downwards double arrow, U+21D3 ISOamsa
+ '⇔' => '⇔', # left right double arrow, U+21D4 ISOamsa
+ '∀' => '∀', # for all, U+2200 ISOtech
+ '∂' => '∂', # partial differential, U+2202 ISOtech
+ '∃' => '∃', # there exists, U+2203 ISOtech
+ '∅' => '∅', # empty set = null set = diameter, U+2205 ISOamso
+ '∇' => '∇', # nabla = backward difference, U+2207 ISOtech
+ '∈' => '∈', # element of, U+2208 ISOtech
+ '∉' => '∉', # not an element of, U+2209 ISOtech
+ '∋' => '∋', # contains as member, U+220B ISOtech
+ '∏' => '∏', # n-ary product = product sign, U+220F ISOamsb
+ '∑' => '∑', # n-ary sumation, U+2211 ISOamsb
+ '−' => '−', # minus sign, U+2212 ISOtech
+ '∗' => '∗', # asterisk operator, U+2217 ISOtech
+ '√' => '√', # square root = radical sign, U+221A ISOtech
+ '∝' => '∝', # proportional to, U+221D ISOtech
+ '∞' => '∞', # infinity, U+221E ISOtech
+ '∠' => '∠', # angle, U+2220 ISOamso
+ '∧' => '∧', # logical and = wedge, U+2227 ISOtech
+ '∨' => '∨', # logical or = vee, U+2228 ISOtech
+ '∩' => '∩', # intersection = cap, U+2229 ISOtech
+ '∪' => '∪', # union = cup, U+222A ISOtech
+ '∫' => '∫', # integral, U+222B ISOtech
+ '∴' => '∴', # therefore, U+2234 ISOtech
+ '∼' => '∼', # tilde operator = varies with = similar to, U+223C ISOtech
+ '≅' => '≅', # approximately equal to, U+2245 ISOtech
+ '≈' => '≈', # almost equal to = asymptotic to, U+2248 ISOamsr
+ '≠' => '≠', # not equal to, U+2260 ISOtech
+ '≡' => '≡', # identical to, U+2261 ISOtech
+ '≤' => '≤', # less-than or equal to, U+2264 ISOtech
+ '≥' => '≥', # greater-than or equal to, U+2265 ISOtech
+ '⊂' => '⊂', # subset of, U+2282 ISOtech
+ '⊃' => '⊃', # superset of, U+2283 ISOtech
+ '⊄' => '⊄', # not a subset of, U+2284 ISOamsn
+ '⊆' => '⊆', # subset of or equal to, U+2286 ISOtech
+ '⊇' => '⊇', # superset of or equal to, U+2287 ISOtech
+ '⊕' => '⊕', # circled plus = direct sum, U+2295 ISOamsb
+ '⊗' => '⊗', # circled times = vector product, U+2297 ISOamsb
+ '⊥' => '⊥', # up tack = orthogonal to = perpendicular, U+22A5 ISOtech
+ '⋅' => '⋅', # dot operator, U+22C5 ISOamsb
+ '⌈' => '⌈', # left ceiling = apl upstile, U+2308 ISOamsc
+ '⌉' => '⌉', # right ceiling, U+2309 ISOamsc
+ '⌊' => '⌊', # left floor = apl downstile, U+230A ISOamsc
+ '⌋' => '⌋', # right floor, U+230B ISOamsc
+ '⟨' => '〈', # left-pointing angle bracket = bra, U+2329 ISOtech
+ '⟩' => '〉', # right-pointing angle bracket = ket, U+232A ISOtech
+ '◊' => '◊', # lozenge, U+25CA ISOpub
+ '♠' => '♠', # black spade suit, U+2660 ISOpub
+ '♣' => '♣', # black club suit = shamrock, U+2663 ISOpub
+ '♥' => '♥', # black heart suit = valentine, U+2665 ISOpub
+ '♦' => '♦', # black diamond suit, U+2666 ISOpub
+ '"' => '"', # quotation mark = APL quote, U+0022 ISOnum
+ '&' => '&', # ampersand, U+0026 ISOnum
+ '<' => '<', # less-than sign, U+003C ISOnum
+ '>' => '>', # greater-than sign, U+003E ISOnum
+ 'Œ' => 'Œ', # latin capital ligature OE, U+0152 ISOlat2
+ 'œ' => 'œ', # latin small ligature oe, U+0153 ISOlat2
+ 'Š' => 'Š', # latin capital letter S with caron, U+0160 ISOlat2
+ 'š' => 'š', # latin small letter s with caron, U+0161 ISOlat2
+ 'Ÿ' => 'Ÿ', # latin capital letter Y with diaeresis, U+0178 ISOlat2
+ 'ˆ' => 'ˆ', # modifier letter circumflex accent, U+02C6 ISOpub
+ '˜' => '˜', # small tilde, U+02DC ISOdia
+ ' ' => ' ', # en space, U+2002 ISOpub
+ ' ' => ' ', # em space, U+2003 ISOpub
+ ' ' => ' ', # thin space, U+2009 ISOpub
+ '‌' => '‌', # zero width non-joiner, U+200C NEW RFC 2070
+ '‍' => '‍', # zero width joiner, U+200D NEW RFC 2070
+ '‎' => '‎', # left-to-right mark, U+200E NEW RFC 2070
+ '‏' => '‏', # right-to-left mark, U+200F NEW RFC 2070
+ '–' => '–', # en dash, U+2013 ISOpub
+ '—' => '—', # em dash, U+2014 ISOpub
+ '‘' => '‘', # left single quotation mark, U+2018 ISOnum
+ '’' => '’', # right single quotation mark, U+2019 ISOnum
+ '‚' => '‚', # single low-9 quotation mark, U+201A NEW
+ '“' => '“', # left double quotation mark, U+201C ISOnum
+ '”' => '”', # right double quotation mark, U+201D ISOnum
+ '„' => '„', # double low-9 quotation mark, U+201E NEW
+ '†' => '†', # dagger, U+2020 ISOpub
+ '‡' => '‡', # double dagger, U+2021 ISOpub
+ '‰' => '‰', # per mille sign, U+2030 ISOtech
+ '‹' => '‹', # single left-pointing angle quotation mark, U+2039 ISO proposed
+ '›' => '›', # single right-pointing angle quotation mark, U+203A ISO proposed
+ '€' => '€', # euro sign, U+20AC NEW
+
+ //XHTML standerd:
+ ''' => ''', # apostrophe = APL quote, U+0027 ISOnum
+ );
+
+ //Enhanced version of SanitizeHTML which is charset-aware for UTF-8 + ISO-8859-1
+ $charset = mb_detect_encoding($name, "auto, ISO-8859-1, UTF-8", true);
+ if(false === $charset) {
+ $charset = 'ISO-8859-1';
+ }
+ $name = htmlentities($name, ENT_QUOTES, $charset, false);
+
+ //Normalize HTML entities
+ $name = strtr($name, $HTML401NamedToNumeric);
return $name;
}
+function expandVariants($name) {
+ static $replacements = array(
+ ' ' => array(' '), # no-break space = non-breaking space, U+00A0 ISOnum
+ '¡' => array('!'), # inverted exclamation mark, U+00A1 ISOnum
+ '¦' => array(''), # broken bar = broken vertical bar, U+00A6 ISOnum
+ '§' => array(''), # section sign, U+00A7 ISOnum
+ '¨' => array(''), # diaeresis = spacing diaeresis, U+00A8 ISOdia
+ '©' => array('(c)'), # copyright sign, U+00A9 ISOnum
+ 'ª' => array(''), # feminine ordinal indicator, U+00AA ISOnum
+ '«' => array('"'), # left-pointing double angle quotation mark = left pointing guillemet, U+00AB ISOnum
+ '¬' => array(''), # not sign, U+00AC ISOnum
+ '­' => array('-'), # soft hyphen = discretionary hyphen, U+00AD ISOnum
+ '®' => array('(r)'), # registered sign = registered trade mark sign, U+00AE ISOnum
+ '¯' => array(''), # macron = spacing macron = overline = APL overbar, U+00AF ISOdia
+ '²' => array('^2'), # superscript two = superscript digit two = squared, U+00B2 ISOnum
+ '³' => array('^3'), # superscript three = superscript digit three = cubed, U+00B3 ISOnum
+ '´' => array(''), # acute accent = spacing acute, U+00B4 ISOdia
+ 'µ' => array('mu'), # micro sign, U+00B5 ISOnum
+ '·' => array('.'), # middle dot = Georgian comma = Greek middle dot, U+00B7 ISOnum
+ '¸' => array(''), # cedilla = spacing cedilla, U+00B8 ISOdia
+ '¹' => array('^1'), # superscript one = superscript digit one, U+00B9 ISOnum
+ 'º' => array(''), # masculine ordinal indicator, U+00BA ISOnum
+ '»' => array('"'), # right-pointing double angle quotation mark = right pointing guillemet, U+00BB ISOnum
+ '¼' => array('1/4'), # vulgar fraction one quarter = fraction one quarter, U+00BC ISOnum
+ '½' => array('1/2'), # vulgar fraction one half = fraction one half, U+00BD ISOnum
+ '¾' => array('3/4'), # vulgar fraction three quarters = fraction three quarters, U+00BE ISOnum
+ '¿' => array('?'), # inverted question mark = turned question mark, U+00BF ISOnum
+ 'À' => array('A'), # latin capital letter A with grave = latin capital letter A grave, U+00C0 ISOlat1
+ 'Á' => array('A'), # latin capital letter A with acute, U+00C1 ISOlat1
+ 'Â' => array('A'), # latin capital letter A with circumflex, U+00C2 ISOlat1
+ 'Ã' => array('A'), # latin capital letter A with tilde, U+00C3 ISOlat1
+ 'Ä' => array('Ae', 'A'), # latin capital letter A with diaeresis, U+00C4 ISOlat1
+ 'Å' => array('A'), # latin capital letter A with ring above = latin capital letter A ring, U+00C5 ISOlat1
+ 'Æ' => array('AE'), # latin capital letter AE = latin capital ligature AE, U+00C6 ISOlat1
+ 'Ç' => array('C'), # latin capital letter C with cedilla, U+00C7 ISOlat1
+ 'È' => array('E'), # latin capital letter E with grave, U+00C8 ISOlat1
+ 'É' => array('E'), # latin capital letter E with acute, U+00C9 ISOlat1
+ 'Ê' => array('E'), # latin capital letter E with circumflex, U+00CA ISOlat1
+ 'Ë' => array('Ee', 'E'), # latin capital letter E with diaeresis, U+00CB ISOlat1
+ 'Ì' => array('I'), # latin capital letter I with grave, U+00CC ISOlat1
+ 'Í' => array('I'), # latin capital letter I with acute, U+00CD ISOlat1
+ 'Î' => array('I'), # latin capital letter I with circumflex, U+00CE ISOlat1
+ 'Ï' => array('Ie', 'I'), # latin capital letter I with diaeresis, U+00CF ISOlat1
+ 'Ð' => array('I'), # latin capital letter ETH, U+00D0 ISOlat1
+ 'Ñ' => array('N'), # latin capital letter N with tilde, U+00D1 ISOlat1
+ 'Ò' => array('O'), # latin capital letter O with grave, U+00D2 ISOlat1
+ 'Ó' => array('O'), # latin capital letter O with acute, U+00D3 ISOlat1
+ 'Ô' => array('O'), # latin capital letter O with circumflex, U+00D4 ISOlat1
+ 'Õ' => array('O'), # latin capital letter O with tilde, U+00D5 ISOlat1
+ 'Ö' => array('Oe', 'O'), # latin capital letter O with diaeresis, U+00D6 ISOlat1
+ '×' => array('*'), # multiplication sign, U+00D7 ISOnum
+ 'Ø' => array('O'), # latin capital letter O with stroke = latin capital letter O slash, U+00D8 ISOlat1
+ 'Ù' => array('U'), # latin capital letter U with grave, U+00D9 ISOlat1
+ 'Ú' => array('U'), # latin capital letter U with acute, U+00DA ISOlat1
+ 'Û' => array('U'), # latin capital letter U with circumflex, U+00DB ISOlat1
+ 'Ü' => array('Ue', 'U'), # latin capital letter U with diaeresis, U+00DC ISOlat1
+ 'Ý' => array('Y'), # latin capital letter Y with acute, U+00DD ISOlat1
+ 'Þ' => array('Th'), # latin capital letter THORN, U+00DE ISOlat1
+ 'ß' => array('ss', 'sz'), # latin small letter sharp s = ess-zed, U+00DF ISOlat1
+ 'à' => array('a'), # latin small letter a with grave = latin small letter a grave, U+00E0 ISOlat1
+ 'á' => array('a'), # latin small letter a with acute, U+00E1 ISOlat1
+ 'â' => array('a'), # latin small letter a with circumflex, U+00E2 ISOlat1
+ 'ã' => array('a'), # latin small letter a with tilde, U+00E3 ISOlat1
+ 'ä' => array('ae', 'a'), # latin small letter a with diaeresis, U+00E4 ISOlat1
+ 'å' => array('a'), # latin small letter a with ring above = latin small letter a ring, U+00E5 ISOlat1
+ 'æ' => array('ae'), # latin small letter ae = latin small ligature ae, U+00E6 ISOlat1
+ 'ç' => array('c'), # latin small letter c with cedilla, U+00E7 ISOlat1
+ 'è' => array('e'), # latin small letter e with grave, U+00E8 ISOlat1
+ 'é' => array('e'), # latin small letter e with acute, U+00E9 ISOlat1
+ 'ê' => array('e'), # latin small letter e with circumflex, U+00EA ISOlat1
+ 'ë' => array('ee', 'e'), # latin small letter e with diaeresis, U+00EB ISOlat1
+ 'ì' => array('i'), # latin small letter i with grave, U+00EC ISOlat1
+ 'í' => array('i'), # latin small letter i with acute, U+00ED ISOlat1
+ 'î' => array('i'), # latin small letter i with circumflex, U+00EE ISOlat1
+ 'ï' => array('ie', 'i'), # latin small letter i with diaeresis, U+00EF ISOlat1
+ 'ð' => array('eth'), # latin small letter eth, U+00F0 ISOlat1
+ 'ñ' => array('n'), # latin small letter n with tilde, U+00F1 ISOlat1
+ 'ò' => array('o'), # latin small letter o with grave, U+00F2 ISOlat1
+ 'ó' => array('o'), # latin small letter o with acute, U+00F3 ISOlat1
+ 'ô' => array('o'), # latin small letter o with circumflex, U+00F4 ISOlat1
+ 'õ' => array('o'), # latin small letter o with tilde, U+00F5 ISOlat1
+ 'ö' => array('oe', 'o'), # latin small letter o with diaeresis, U+00F6 ISOlat1
+ '÷' => array('/'), # division sign, U+00F7 ISOnum
+ 'ø' => array('o'), # latin small letter o with stroke, = latin small letter o slash, U+00F8 ISOlat1
+ 'ù' => array('o'), # latin small letter u with grave, U+00F9 ISOlat1
+ 'ú' => array('u'), # latin small letter u with acute, U+00FA ISOlat1
+ 'û' => array('u'), # latin small letter u with circumflex, U+00FB ISOlat1
+ 'ü' => array('u'), # latin small letter u with diaeresis, U+00FC ISOlat1
+ 'ý' => array('y'), # latin small letter y with acute, U+00FD ISOlat1
+ 'þ' => array('th'), # latin small letter thorn, U+00FE ISOlat1
+ 'ÿ' => array('y', 'ij', 'ii', 'ei'), # latin small letter y with diaeresis, U+00FF ISOlat1
+ 'ƒ' => array('f'), # latin small f with hook = function = florin, U+0192 ISOtech
+ '…' => array('...'), # horizontal ellipsis = three dot leader, U+2026 ISOpub
+ '′' => array('\''), # prime = minutes = feet, U+2032 ISOtech
+ '″' => array('"'), # double prime = seconds = inches, U+2033 ISOtech
+ '‾' => array(''), # overline = spacing overscore, U+203E NEW
+ '⁄' => array('/'), # fraction slash, U+2044 NEW
+ '™' => array('(tm)', 'tm'), # trade mark sign, U+2122 ISOnum
+ '−' => array('-'), # minus sign, U+2212 ISOtech
+ '∗' => array('*'), # asterisk operator, U+2217 ISOtech
+ '∼' => array('~'), # tilde operator = varies with = similar to, U+223C ISOtech
+ '⊕' => array('+'), # circled plus = direct sum, U+2295 ISOamsb
+ '⊗' => array('*'), # circled times = vector product, U+2297 ISOamsb
+ 'Œ' => array('OE'), # latin capital ligature OE, U+0152 ISOlat2
+ 'œ' => array('oe'), # latin small ligature oe, U+0153 ISOlat2
+ 'Š' => array('s'), # latin capital letter S with caron, U+0160 ISOlat2
+ 'š' => array('s'), # latin small letter s with caron, U+0161 ISOlat2
+ 'Ÿ' => array('Y', 'Ij', 'Ii', 'Ei'), # latin capital letter Y with diaeresis, U+0178 ISOlat2
+ 'ˆ' => array(''), # modifier letter circumflex accent, U+02C6 ISOpub
+ '˜' => array('~'), # small tilde, U+02DC ISOdia
+ ' ' => array(' '), # en space, U+2002 ISOpub
+ ' ' => array(' '), # em space, U+2003 ISOpub
+ ' ' => array(' '), # thin space, U+2009 ISOpub
+ '–' => array('-'), # em dash, U+2014 ISOpub
+ '—' => array('-'), # em dash, U+2014 ISOpub
+ '‘' => array('\''), # left single quotation mark, U+2018 ISOnum
+ '’' => array('\''), # right single quotation mark, U+2019 ISOnum
+ '‚' => array('\''), # single low-9 quotation mark, U+201A NEW
+ '“' => array('"'), # left double quotation mark, U+201C ISOnum
+ '”' => array('"'), # right double quotation mark, U+201D ISOnum
+ '„' => array('"'), # double low-9 quotation mark, U+201E NEW
+ '‹' => array('\''), # single left-pointing angle quotation mark, U+2039 ISO proposed
+ '›' => array('\''), # single right-pointing angle quotation mark, U+203A ISO proposed
+ );
+
+ $variants = array($name);
+
+ foreach($replacements as $rk => $rv) {
+ $vnew = array();
+ foreach($variants as $variant) {
+ foreach($rv as $rv1) {
+ $vnew[] = str_replace($rk, $rv1, $variant);
+ }
+ }
+ $variants = $vnew;
+ }
+
+ $variants = array_filter($variants, function($a) { return false === strstr($a, "&"); } );
+
+ return $variants;
+}
+
function compareName($requested, $acceptable) {
if(empty($acceptable) || empty($requested)) {
return false;
@@ -77,6 +487,13 @@ function compareName($requested, $acceptable) {
return true;
}
+ $variants = expandVariants($acceptable);
+ foreach($variants as $acceptable_variant) {
+ if(0 === strcasecmp($requested, $acceptable_variant)) {
+ return true;
+ }
+ }
+
return false;
}