function singularize($string) { $inflections =& Inflector::inflections(); if (in_array(strtolower($string), $inflections->uncountables)) { return $string; } foreach ($inflections->singulars as $singular) { list($rule, $replacement) = $singular; # This looks redundant but is needed for PHP4 compatibility if (preg_match($rule, $string)) { $result = preg_replace($rule, $replacement, $string, 1); break; } } if (!isset($result)) { $result = $string; } return $result; }
Inflector::inflections(function ($inflect) { $inflect->plural('/$/', 's'); $inflect->plural('/s$/i', 's'); $inflect->plural('/^(ax|test)is$/i', '\\1es'); $inflect->plural('/(octop|vir)us$/i', '\\1i'); $inflect->plural('/(octop|vir)i$/i', '\\1i'); $inflect->plural('/(alias|status)$/i', '\\1es'); $inflect->plural('/(bu)s$/i', '\\1ses'); $inflect->plural('/(buffal|tomat)o$/i', '\\1oes'); $inflect->plural('/([ti])um$/i', '\\1a'); $inflect->plural('/([ti])a$/i', '\\1a'); $inflect->plural('/sis$/i', 'ses'); $inflect->plural('/(?:([^f])fe|([lr])f)$/i', '\\1\\2ves'); $inflect->plural('/(hive)$/i', '\\1s'); $inflect->plural('/([^aeiouy]|qu)y$/i', '\\1ies'); $inflect->plural('/(x|ch|ss|sh)$/i', '\\1es'); $inflect->plural('/(matr|vert|ind)(?:ix|ex)$/i', '\\1ices'); $inflect->plural('/^(m|l)ouse$/i', '\\1ice'); $inflect->plural('/^(m|l)ice$/i', '\\1ice'); $inflect->plural('/^(ox)$/i', '\\1en'); $inflect->plural('/^(oxen)$/i', '\\1'); $inflect->plural('/(quiz)$/i', '\\1zes'); $inflect->singular('/s$/i', ''); $inflect->singular('/(ss)$/i', '\\1'); $inflect->singular('/(n)ews$/i', '\\1ews'); $inflect->singular('/([ti])a$/i', '\\1um'); $inflect->singular('/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(sis|ses)$/i', '\\1\\2sis'); $inflect->singular('/(^analy)(sis|ses)$/i', '\\1sis'); $inflect->singular('/([^f])ves$/i', '\\1fe'); $inflect->singular('/(hive)s$/i', '\\1'); $inflect->singular('/(tive)s$/i', '\\1'); $inflect->singular('/([lr])ves$/i', '\\1f'); $inflect->singular('/([^aeiouy]|qu)ies$/i', '\\1y'); $inflect->singular('/(s)eries$/i', '\\1eries'); $inflect->singular('/(m)ovies$/i', '\\1ovie'); $inflect->singular('/(x|ch|ss|sh)es$/i', '\\1'); $inflect->singular('/^(m|l)ice$/i', '\\1ouse'); $inflect->singular('/(bus)(es)?$/i', '\\1'); $inflect->singular('/(o)es$/i', '\\1'); $inflect->singular('/(shoe)s$/i', '\\1'); $inflect->singular('/(cris|test)(is|es)$/i', '\\1is'); $inflect->singular('/^(a)x[ie]s$/i', '\\1xis'); $inflect->singular('/(octop|vir)(us|i)$/i', '\\1us'); $inflect->singular('/(alias|status)(es)?$/i', '\\1'); $inflect->singular('/^(ox)en/i', '\\1'); $inflect->singular('/(vert|ind)ices$/i', '\\1ex'); $inflect->singular('/(matr)ices$/i', '\\1ix'); $inflect->singular('/(quiz)zes$/i', '\\1'); $inflect->singular('/(database)s$/i', '\\1'); $inflect->irregular('person', 'people'); $inflect->irregular('man', 'men'); $inflect->irregular('child', 'children'); $inflect->irregular('sex', 'sexes'); $inflect->irregular('move', 'moves'); $inflect->irregular('cow', 'kine'); $inflect->irregular('zombie', 'zombies'); $inflect->uncountable('equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep', 'jeans', 'police'); });