Skip to content

Instantly share code, notes, and snippets.

@MilkZoft
Created January 19, 2012 03:30
Show Gist options
  • Select an option

  • Save MilkZoft/1637583 to your computer and use it in GitHub Desktop.

Select an option

Save MilkZoft/1637583 to your computer and use it in GitHub Desktop.
codejobs - Singularize words
<?php
function singularize($word) {
$uncountable = array("sheep",
"fish",
"deer",
"series",
"species",
"money",
"rice",
"information",
"equipment"
);
$irregular = array( "move" => "moves",
"foot" => "feet",
"goose" => "geese",
"sex" => "sexes",
"child" => "children",
"man" => "men",
"tooth" => "teeth",
"person" => "people"
);
$singular = array( "/(quiz)zes$/i" => "$1",
"/(matr)ices$/i" => "$1ix",
"/(vert|ind)ices$/i" => "$1ex",
"/^(ox)en$/i" => "$1",
"/(alias)es$/i" => "$1",
"/(octop|vir)i$/i" => "$1us",
"/(cris|ax|test)es$/i" => "$1is",
"/(shoe)s$/i" => "$1",
"/(o)es$/i" => "$1",
"/(bus)es$/i" => "$1",
"/([m|l])ice$/i" => "$1ouse",
"/(x|ch|ss|sh)es$/i" => "$1",
"/(m)ovies$/i" => "$1ovie",
"/(s)eries$/i" => "$1eries",
"/([^aeiouy]|qu)ies$/i" => "$1y",
"/([lr])ves$/i" => "$1f",
"/(tive)s$/i" => "$1",
"/(hive)s$/i" => "$1",
"/(li|wi|kni)ves$/i" => "$1fe",
"/(shea|loa|lea|thie)ves$/i" => "$1f",
"/(^analy)ses$/i" => "$1sis",
"/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$/i" => "$1$2sis",
"/([ti])a$/i" => "$1um",
"/(n)ews$/i" => "$1ews",
"/(h|bl)ouses$/i" => "$1ouse",
"/(corpse)s$/i" => "$1",
"/(us)es$/i" => "$1",
"/s$/i" => ""
);
if(in_array(strtolower($word), $uncountable)) {
return $word;
}
foreach($irregular as $result => $pattern) {
$pattern = "/$pattern$/i";
if(preg_match($pattern, $word)) {
return preg_replace($pattern, $result, $word);
}
}
foreach($singular as $pattern => $result) {
if(preg_match($pattern, $word)) {
return preg_replace($pattern, $result, $word);
}
}
return $word;
}
?>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment