65.9K
CodeProject 正在变化。 阅读更多。
Home

英语简单过去式和过去分词 PHP 自动生成以及英语单词音节计数

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.33/5 (2投票s)

2021年1月26日

CPOL
viewsIcon

6173

英语简单过去式和过去分词 PHP 自动生成以及英语单词音节计数

英语动词形式

英语动词有以下形式:原形、简单过去式和过去分词。对于规则动词,只需在词尾添加“ed”即可生成简单过去式和过去分词。但事情并非如此简单。

形式情况

  • 如果动词以“e”结尾,则只添加“d”。例如,“arrive + d = arrived”。
  • 如果动词以辅音 + “y”结尾,将“y”改为“i”并添加“-ed”。例如,“study + ed = studied”。
  • 如果动词以元音 + “y”结尾,则添加“-ed”。例如,“play + ed = played”。
  • 如果动词只有一个音节且以元音 + 辅音结尾,则将辅音加倍。例如,“stop + p + ed = stopped”。
  • 如果动词的重音在最后一个音节,且以元音 + 辅音结尾,则将辅音加倍。例如,“prefer + r + ed = preferred”。
  • 如果动词的重音不在最后一个音节,且以元音 + 辅音结尾,则只添加“-ed”。例如,“óffer + ed = offered”。

建议的 PHP 代码

如果您有任何意见,请在下面的评论中分享

function english_verb_forms( string $infinitive ) {    
    $infinitive = trim( strtolower( $infinitive ) );
    if ( !$infinitive ) return ''; 
    #1 english irregular verbs
    $sql = "SELECT simple_past, past_participle, 
    regular, form_case FROM english_verbs WHERE 
    infinitive = '$infinitive'";
    global $wpdb;
    $verb = $wpdb->get_row( $sql, ARRAY_A );
    if ( $verb ) return $verb;    
    $verb = array();
    $verb['regular'] = 'regular' ;
    $last = substr( $infinitive, -1 );
    #2 infinitive ends with e
    if ( $last == 'e' ) {
        $verb['simple_past'] = $infinitive . 'd';
        $verb['past_participle'] = $verb['simple_past'];
        $verb['form_case'] = 'e' ;        
        return $verb;
    }
    #3 and #4 infinitive ends with y
    if ( $last == 'y' ) {
        $last2 = substr( $infinitive, -2, 1 );
        #3 infinitive ends with vowel + y
        if ( strpos( ' aeuio', $last2 ) === false ) {
            $i = strlen( $infinitive ) - 2;
            $verb['simple_past'] = substr( $infinitive, 0, $i ) . 'ied';
            $verb['past_participle'] = $verb['simple_past'];
            $verb['form_case'] = 'vowel + y' ;        
            return $verb;
        } else {
            #4 infinitive ends with consonant + y
            $verb['simple_past'] = $infinitive . 'ed';
            $verb['past_participle'] = $verb['simple_past'];
            $verb['form_case'] = 'consonant + y' ;        
            return $verb;            
        }
    }
    #5 infinitive ends with vowel
    if ( strpos( ' aeuiow', $last ) !== false ) {
        $verb['simple_past'] = $infinitive . 'ed';
        $verb['past_participle'] = $verb['simple_past'];
        $verb['form_case'] = '' ;        
        return $verb;            
    }
    #infinitive ends with vowel
    $syllables = syllable_count( $infinitive );
    if ( !$syllables ) {
        $verb['simple_past'] = $infinitive . 'ed';
        $verb['past_participle'] = $verb['simple_past'];
        $verb['form_case'] = '' ;        
        return $verb;                    
    }
    if ( $syllables == 1 ) {
        #5 infinitive has single syllable and ends with consonant
        $verb['simple_past'] = $infinitive . $last . 'ed';
        $verb['past_participle'] = $verb['simple_past'];
        $verb['form_case'] = 'double last' ;        
        return $verb;                    
    }
    #other cases
    return false;
}


//##################
function syllable_count( string $str_word ) {
    /* Count syllables in a single word, simple version */
    $str_word = trim( strtolower( $str_word ) );
    if ( !$str_word ) return 0;
    if ( strpos( $str_word, ' ' ) ) return 0;
    $len = strlen( $str_word );
    #1
    if ( $len <= 3 ) return 1;
    
    $word = str_split( $str_word );    
    $syllables = 0;
    $vowels = array( 'a', 'e', 'i', 'o', 'u', 'y' );
    $first = $word[ 0 ];
    if ( in_array( $first, $vowels ) )$syllables++;
    for ( $i = 1; $i < count( $word ); $i++ ) {
        if ( in_array( $word[ $i ], $vowels ) &&
            in_array( $word[ $i - 1 ], $vowels ) )$syllables++;
    }
    if ( substr( $str_word, -1 ) == 'e' )$syllables--;
    if ( $syllables == 0 )$syllables++;
    return $syllables;
}
//######################

 

历史

  • 2021年1月26日:初始版本
© . All rights reserved.