DaveChild\TextStatistics\Syllables::syllableCount PHP Метод

syllableCount() публичный статический Метод

Based in part on Greg Fast's Perl module Lingua::EN::Syllables
public static syllableCount ( string $strWord, string $strEncoding = '' ) : integer
$strWord string Word to be measured
$strEncoding string Encoding of text
Результат integer
    public static function syllableCount($strWord, $strEncoding = '')
    {
        // Trim whitespace
        $strWord = trim($strWord);
        // Check we have some letters
        if (Text::letterCount(trim($strWord), $strEncoding) == 0) {
            return 0;
        }
        // $debug is an array containing the basic syllable counting steps for
        // this word.
        $debug = array();
        $debug['Counting syllables for'] = $strWord;
        // Should be no non-alpha characters and lower case
        $strWord = preg_replace('`[^A-Za-z]`', '', $strWord);
        $strWord = Text::lowerCase($strWord, $strEncoding);
        // Check for problem words
        if (isset(self::$arrProblemWords[$strWord])) {
            return self::$arrProblemWords[$strWord];
        }
        // Try singular
        $singularWord = Pluralise::getSingular($strWord);
        if ($singularWord != $strWord) {
            if (isset(self::$arrProblemWords[$singularWord])) {
                return self::$arrProblemWords[$singularWord];
            }
        }
        $debug['After cleaning, lcase'] = $strWord;
        // Remove prefixes and suffixes and count how many were taken
        $strWord = preg_replace(self::$arrAffix, '', $strWord, -1, $intAffixCount);
        $strWord = preg_replace(self::$arrDoubleAffix, '', $strWord, -1, $intDoubleAffixCount);
        $strWord = preg_replace(self::$arrTripleAffix, '', $strWord, -1, $intTripleAffixCount);
        if ($intAffixCount + $intDoubleAffixCount + $intTripleAffixCount > 0) {
            $debug['After Prefix and Suffix Removal'] = $strWord;
            $debug['Prefix and suffix counts'] = $intAffixCount . ' * 1 syllable, ' . $intDoubleAffixCount . ' * 2 syllables, ' . $intTripleAffixCount . ' * 3 syllables';
        }
        // Removed non-word characters from word
        $arrWordParts = preg_split('`[^aeiouy]+`', $strWord);
        $intWordPartCount = 0;
        foreach ($arrWordParts as $strWordPart) {
            if ($strWordPart != '') {
                $debug['Counting (' . $intWordPartCount . ')'] = $strWordPart;
                $intWordPartCount++;
            }
        }
        // Some syllables do not follow normal rules - check for them
        // Thanks to Joe Kovar for correcting a bug in the following lines
        $intSyllableCount = $intWordPartCount + $intAffixCount + 2 * $intDoubleAffixCount + 3 * $intTripleAffixCount;
        $debug['Syllables by Vowel Count'] = $intSyllableCount;
        foreach (self::$arrSubSyllables as $strSyllable) {
            $_intSyllableCount = $intSyllableCount;
            $intSyllableCount -= preg_match('`' . $strSyllable . '`', $strWord);
            if ($_intSyllableCount != $intSyllableCount) {
                $debug['Subtracting (' . $strSyllable . ')'] = $strSyllable;
            }
        }
        foreach (self::$arrAddSyllables as $strSyllable) {
            $_intSyllableCount = $intSyllableCount;
            $intSyllableCount += preg_match('`' . $strSyllable . '`', $strWord);
            if ($_intSyllableCount != $intSyllableCount) {
                $debug['Adding (' . $strSyllable . ')'] = $strSyllable;
            }
        }
        $intSyllableCount = $intSyllableCount == 0 ? 1 : $intSyllableCount;
        $debug['Result'] = $intSyllableCount;
        return $intSyllableCount;
    }

Usage Example

 /**
  * Returns the text statistics for an article.
  *
  * @param string $articleId
  * @param string $template
  *
  * @return TextStatisticsModel
  */
 public function getTextStatistics($articleId = '', $wpm = null, $readingTimeTemplate = null)
 {
     if (!isset($this->articlesData[$articleId])) {
         return null;
     }
     $articleData =& $this->getArticleDataById($articleId);
     $wordCount = Text::wordCount($articleData['text']);
     $wpm = $wpm ?: craft()->config->get('wordsPerMinute', 'textStatistics');
     // Calculate times in seconds
     $textReadingTime = $wordCount / $wpm * 60;
     $additionalTime = $articleData['additionalTime'];
     $totalTime = ceil($textReadingTime + $additionalTime);
     $readingTime = $this->getDateIntervalFromSeconds($totalTime);
     $readingTimeMinutes = ceil($totalTime / 60);
     // Render Twig template for the readingTimeString
     $variables = ['iv' => $readingTime, 'min' => $readingTimeMinutes];
     $template = $readingTimeTemplate ?: craft()->config->get('readingTimeTemplate', 'textStatistics');
     $readingTimeString = craft()->templates->renderString($template, $variables);
     // Populate Statistics model
     $model = new TextStatisticsModel();
     $model->textLength = Text::textLength($articleData['text']);
     $model->letterCount = Text::letterCount($articleData['text']);
     $model->syllableCount = Syllables::syllableCount($articleData['text']);
     $model->wordCount = $wordCount;
     $model->sentenceCount = Text::sentenceCount($articleData['text']);
     $model->readingTime = $readingTime;
     $model->readingTimeMinutes = $readingTimeMinutes;
     $model->readingTimeString = $readingTimeString;
     $textStatistics = $this->getTextStatisticsClass();
     $model->gunningFog = $textStatistics->gunningFogScore($articleData['text']);
     $model->fleschKincaid = $textStatistics->fleschKincaidReadingEase($articleData['text']);
     if (!$model->validate()) {
         throw new Exception('There was an error while generating the Text Statistics.');
     }
     return $model;
 }