@@ -81,17 +81,20 @@ public function ascii(array $rules = []): self
81
81
$ s = $ str ->string ;
82
82
$ str ->string = '' ;
83
83
84
- $ rules [] = 'nfkd ' ;
85
- $ rules [] = '[:nonspacing mark:] remove ' ;
84
+ if (!$ rules ) {
85
+ $ rules [] = '[:nonspacing mark:] remove ' ;
86
+ }
87
+
88
+ array_unshift ($ rules , 'nfd ' );
86
89
87
90
if (\function_exists ('transliterator_transliterate ' )) {
88
91
$ rules [] = 'any-latin/bgn ' ;
89
92
$ rules [] = 'nfkd ' ;
90
93
$ rules [] = '[:nonspacing mark:] remove ' ;
91
94
}
92
95
93
- while (\strlen ($ s ) !== $ i = strspn ($ s , self ::ASCII )) {
94
- if (0 !== $ i ) {
96
+ while (\strlen ($ s ) - 1 > $ i = strspn ($ s , self ::ASCII )) {
97
+ if (0 < -- $ i ) {
95
98
$ str ->string .= substr ($ s , 0 , $ i );
96
99
$ s = substr ($ s , $ i );
97
100
}
@@ -106,10 +109,10 @@ public function ascii(array $rules = []): self
106
109
continue ;
107
110
}
108
111
109
- if ('nfkd ' === $ rule = strtolower ($ rule )) {
110
- if (! normalizer_is_normalized ($ s , self ::NFKD )) {
111
- $ s = normalizer_normalize ( $ s , self :: NFKD );
112
- }
112
+ if ('nfd ' === $ rule = strtolower ($ rule )) {
113
+ normalizer_is_normalized ($ s , self ::NFD ) ?: $ s = normalizer_normalize ( $ s , self :: NFD );
114
+ } elseif ( ' nfkd ' === $ rule ) {
115
+ normalizer_is_normalized ( $ s , self :: NFKD ) ?: $ s = normalizer_normalize ( $ s , self :: NFKD );
113
116
} elseif ('[:nonspacing mark:] remove ' === $ rule ) {
114
117
$ s = preg_replace ('/\p{Mn}++/u ' , '' , $ s );
115
118
} elseif ('de-ascii ' === $ rule ) {
0 commit comments