Вход Регистрация
Файл: symfony-2.7/src/Symfony/Component/PropertyAccess/StringUtil.php
Строк: 169
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentPropertyAccess;

/**
 * Creates singulars from plurals.
 *
 * @author Bernhard Schussek <bschussek@gmail.com>
 */
class StringUtil
{
    
/**
     * Map english plural to singular suffixes.
     *
     * @var array
     *
     * @see http://english-zone.com/spelling/plurals.html
     * @see http://www.scribd.com/doc/3271143/List-of-100-Irregular-Plural-Nouns-in-English
     */
    
private static $pluralMap = array(
        
// First entry: plural suffix, reversed
        // Second entry: length of plural suffix
        // Third entry: Whether the suffix may succeed a vocal
        // Fourth entry: Whether the suffix may succeed a consonant
        // Fifth entry: singular suffix, normal

        // bacteria (bacterium), criteria (criterion), phenomena (phenomenon)
        
array('a'1truetrue, array('on''um')),

        
// nebulae (nebula)
        
array('ea'2truetrue'a'),

        
// mice (mouse), lice (louse)
        
array('eci'3falsetrue'ouse'),

        
// geese (goose)
        
array('esee'4falsetrue'oose'),

        
// fungi (fungus), alumni (alumnus), syllabi (syllabus), radii (radius)
        
array('i'1truetrue'us'),

        
// men (man), women (woman)
        
array('nem'3truetrue'man'),

        
// children (child)
        
array('nerdlihc'8truetrue'child'),

        
// oxen (ox)
        
array('nexo'4falsefalse'ox'),

        
// indices (index), appendices (appendix), prices (price)
        
array('seci'4falsetrue, array('ex''ix''ice')),

        
// babies (baby)
        
array('sei'3falsetrue'y'),

        
// accesses (access), addresses (address), kisses (kiss)
        
array('sess'4truefalse'ss'),

        
// analyses (analysis), ellipses (ellipsis), funguses (fungus),
        // neuroses (neurosis), theses (thesis), emphases (emphasis),
        // oases (oasis), crises (crisis), houses (house), bases (base),
        // atlases (atlas)
        
array('ses'3truetrue, array('s''se''sis')),

        
// objectives (objective), alternative (alternatives)
        
array('sevit'5truetrue'tive'),

        
// drives (drive)
        
array('sevird'6falsetrue'drive'),

        
// lives (life), wives (wife)
        
array('sevi'4falsetrue'ife'),

        
// moves (move)
        
array('sevom'5truetrue'move'),

        
// hooves (hoof), dwarves (dwarf), elves (elf), leaves (leaf), caves (cave), staves (staff)
        
array('sev'3truetrue, array('f''ve''ff')),

        
// axes (axis), axes (ax), axes (axe)
        
array('sexa'4falsefalse, array('ax''axe''axis')),

        
// indexes (index), matrixes (matrix)
        
array('sex'3truefalse'x'),

        
// quizzes (quiz)
        
array('sezz'4truefalse'z'),

        
// bureaus (bureau)
        
array('suae'4falsetrue'eau'),

        
// roses (rose), garages (garage), cassettes (cassette),
        // waltzes (waltz), heroes (hero), bushes (bush), arches (arch),
        // shoes (shoe)
        
array('se'2truetrue, array('''e')),

        
// tags (tag)
        
array('s'1truetrue''),

        
// chateaux (chateau)
        
array('xuae'4falsetrue'eau'),
    );

    
/**
     * This class should not be instantiated.
     */
    
private function __construct()
    {
    }

    
/**
     * Returns the singular form of a word.
     *
     * If the method can't determine the form with certainty, an array of the
     * possible singulars is returned.
     *
     * @param string $plural A word in plural form
     *
     * @return string|array The singular form or an array of possible singular
     *                      forms
     */
    
public static function singularify($plural)
    {
        
$pluralRev strrev($plural);
        
$lowerPluralRev strtolower($pluralRev);
        
$pluralLength strlen($lowerPluralRev);

        
// The outer loop iterates over the entries of the plural table
        // The inner loop $j iterates over the characters of the plural suffix
        // in the plural table to compare them with the characters of the actual
        // given plural suffix
        
foreach (self::$pluralMap as $map) {
            
$suffix $map[0];
            
$suffixLength $map[1];
            
$j 0;

            
// Compare characters in the plural table and of the suffix of the
            // given plural one by one
            
while ($suffix[$j] === $lowerPluralRev[$j]) {
                
// Let $j point to the next character
                
++$j;

                
// Successfully compared the last character
                // Add an entry with the singular suffix to the singular array
                
if ($j === $suffixLength) {
                    
// Is there any character preceding the suffix in the plural string?
                    
if ($j $pluralLength) {
                        
$nextIsVocal false !== strpos('aeiou'$lowerPluralRev[$j]);

                        if (!
$map[2] && $nextIsVocal) {
                            
// suffix may not succeed a vocal but next char is one
                            
break;
                        }

                        if (!
$map[3] && !$nextIsVocal) {
                            
// suffix may not succeed a consonant but next char is one
                            
break;
                        }
                    }

                    
$newBase substr($plural0$pluralLength $suffixLength);
                    
$newSuffix $map[4];

                    
// Check whether the first character in the plural suffix
                    // is uppercased. If yes, uppercase the first character in
                    // the singular suffix too
                    
$firstUpper ctype_upper($pluralRev[$j 1]);

                    if (
is_array($newSuffix)) {
                        
$singulars = array();

                        foreach (
$newSuffix as $newSuffixEntry) {
                            
$singulars[] = $newBase.($firstUpper ucfirst($newSuffixEntry) : $newSuffixEntry);
                        }

                        return 
$singulars;
                    }

                    return 
$newBase.($firstUpper ucfirst($newSuffix) : $newSuffix);
                }

                
// Suffix is longer than word
                
if ($j === $pluralLength) {
                    break;
                }
            }
        }

        
// Convert teeth to tooth, feet to foot
        
if (false !== ($pos strpos($plural'ee')) && strlen($plural) > 3) {
            return 
substr_replace($plural'oo'$pos2);
        }

        
// Assume that plural and singular is identical
        
return $plural;
    }
}
Онлайн: 0
Реклама