[ * [ * 'forms' => [ 'message', 'messages' ], * 'original' => '{0:message|messages}', * ], * [ * 'forms' => [ 'has', 'have' ], * 'original' => '{0:has|have}', * ], * ], * '1' => [ * [ * 'forms' => [ 'week', 'weeks' ], * 'original' => '{1:week|weeks}', * ], * ], * ] * * @param string $text * @return array */ public static function getPluralInstances( string $text ): array { // ldns = Large Deeply-Nested Structure $ldns = []; // Named variables seem to be supported by the spec, but we limit ourselves // only to numbers. Example syntax {0:message|messages} $regex = '/\{(\d+):([^}]+)\}/Us'; $matches = []; preg_match_all( $regex, $text, $matches, PREG_SET_ORDER ); foreach ( $matches as $instance ) { $original = $instance[ 0 ]; $variable = $instance[ 1 ]; $forms = explode( '|', $instance[ 2 ] ); $ldns[ $variable ] = $ldns[ $variable ] ?? []; $ldns[ $variable ][] = [ 'forms' => $forms, 'original' => $original, ]; } return $ldns; } }