* @version 0.1 */ class fl_inflector { /** * Speicher für Ersetzungsregeln */ var $plural = array(); var $singular = array(); var $uncountable = array(); var $irregular = array(); /** * Konstruktor */ function __construct($lang = null) { switch ( $lang ) { case 'de': $this->plural = array( '/^([a-z]*)(ung|heit|schaft|ion)$/i'=>'\1\2en', '/^([a-z]*)(probe)$/i'=>'\1\2n', '/^([a-z]*[^aoieukgh])$/i' =>'\1e', ); $this->singular = array( '/^([a-z]*)(ung|heit|schaft|ion)en$/i'=>'\1\2', '/^([a-z]*)(probe)n$/i'=>'\1\2', '/^([a-z]*)e/i' => '\1', ); $this->uncountable = array( 'daten', 'bankdaten', 'cover', 'musiktitel', 'titel', ); $this->irregular = array( 'account' => 'accounts', 'land' => 'laender', ); break; case 'en': default: $this->plural = array( '/(quiz)$/i' => '\1zes', '/^(ox)$/i' => '\1en', '/([m|l])ouse$/i' => '\1ice', '/(matr|vert|ind)ix|ex$/i' => '\1ices', '/(x|ch|ss|sh)$/i' => '\1es', '/([^aeiouy]|qu)ies$/i' => '\1y', '/([^aeiouy]|qu)y$/i' => '\1ies', '/(hive)$/i' => '\1s', '/(?:([^f])fe|([lr])f)$/i' => '\1\2ves', '/sis$/i' => 'ses', '/([ti])um$/i' => '\1a', '/(buffal|tomat)o$/i' => '\1oes', '/(bu)s$/i' => '\1ses', '/(alias|status)/i'=> '\1es', '/(octop|vir)us$/i'=> '\1i', '/(ax|test)is$/i'=> '\1es', '/s$/i'=> 's', '/$/'=> 's' ); $this->singular = array ( '/(quiz)zes$/i' => '\\1', '/(matr)ices$/i' => '\\1ix', '/(vert|ind)ices$/i' => '\\1ex', '/^(ox)en/i' => '\\1', '/(alias|status)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', '/([^f])ves$/i' => '\\1fe', '/(^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', '/s$/i' => '', ); $this->uncountable = array( 'equipment', 'information', 'rice', 'money', 'species', 'series', 'fish', 'sheep' ); $this->irregular = array( 'person' => 'people', 'man' => 'men', 'child' => 'children', 'sex' => 'sexes', 'move' => 'moves' ); break; } } /** * Bildung der Pluralform eines Wortes * * @param string $word * @return string Pluralform */ function plural($word) { $plural = $this->plural; $uncountable = $this->uncountable; $irregular = $this->irregular; $lowercased_word = strtolower($word); foreach ($uncountable as $_uncountable){ if(substr($lowercased_word,(-1*strlen($_uncountable))) == $_uncountable){ return $word; } } foreach ($irregular as $_plural=> $_singular){ if (preg_match('/('.$_plural.')$/i', $word, $arr)) { return preg_replace('/('.$_plural.')$/i', substr($arr[0],0,1).substr($_singular,1), $word); } } foreach ($plural as $rule => $replacement) { if (preg_match($rule, $word)) { return preg_replace($rule, $replacement, $word); } } return false; } /** * Bildung der Singularform eines Wortes * * @param string $word * @return string Singularform */ function singular($word) { $singular = $this->singular; $uncountable = $this->uncountable; $irregular = $this->irregular; $lowercased_word = strtolower($word); foreach ($uncountable as $_uncountable){ if(substr($lowercased_word,(-1*strlen($_uncountable))) == $_uncountable){ return $word; } } foreach ($irregular as $_plural=> $_singular){ if (preg_match('/('.$_singular.')$/i', $word, $arr)) { return preg_replace('/('.$_singular.')$/i', substr($arr[0],0,1).substr($_plural,1), $word); } } foreach ($singular as $rule => $replacement) { if (preg_match($rule, $word)) { return preg_replace($rule, $replacement, $word); } } return $word; } }