1919
2020use function array_column ;
2121use function array_flip ;
22+ use function ctype_alnum ;
23+ use function ctype_space ;
2224use function parse_url ;
2325use function preg_match ;
26+ use function str_ends_with ;
27+ use function str_replace ;
28+ use function strlen ;
29+ use function substr ;
2430
2531use const PHP_URL_SCHEME ;
2632
@@ -111,6 +117,7 @@ protected function getType(string &$value)
111117 {
112118 $ type = match ($ value ) {
113119 '` ' => self ::BACKTICK ,
120+ '`` ' => self ::DOUBLE_BACKTICK ,
114121 '** ' => self ::STRONG_DELIMITER ,
115122 '* ' => self ::EMPHASIS_DELIMITER ,
116123 '| ' => self ::VARIABLE_DELIMITER ,
@@ -130,10 +137,22 @@ protected function getType(string &$value)
130137 }
131138
132139 // $value is already a tokenized part. Therefore, we have to match against the complete String here.
133- if (preg_match ('/^ \\\\[\s\S]$/i ' , $ value )) {
140+ if (str_ends_with ($ value , '__ ' ) && ctype_alnum (str_replace ('- ' , '' , substr ($ value , 0 , -2 )))) {
141+ return self ::ANONYMOUSE_REFERENCE ;
142+ }
143+
144+ if (str_ends_with ($ value , '_ ' ) && ctype_alnum (str_replace ('- ' , '' , substr ($ value , 0 , -1 )))) {
145+ return self ::NAMED_REFERENCE ;
146+ }
147+
148+ if (strlen ($ value ) === 2 && $ value [0 ] === '\\' ) {
134149 return self ::ESCAPED_SIGN ;
135150 }
136151
152+ if (strlen ($ value ) === 1 && ctype_space ($ value )) {
153+ return self ::WHITESPACE ;
154+ }
155+
137156 if (preg_match ('/^``.+``(?!`)$/i ' , $ value )) {
138157 return self ::LITERAL ;
139158 }
@@ -146,18 +165,6 @@ protected function getType(string &$value)
146165 return self ::EMAIL ;
147166 }
148167
149- if (preg_match ('/^[a-z0-9-]+_{2}$/i ' , $ value )) {
150- return self ::ANONYMOUSE_REFERENCE ;
151- }
152-
153- if (preg_match ('/^[a-z0-9-]+_{1}$/i ' , $ value )) {
154- return self ::NAMED_REFERENCE ;
155- }
156-
157- if (preg_match ('/^\s$/i ' , $ value )) {
158- return self ::WHITESPACE ;
159- }
160-
161168 return self ::WORD ;
162169 }
163170}
0 commit comments