@@ -794,41 +794,17 @@ public function _helper_like_to_glob_pattern( $pattern ) {
794
794
$ pattern = str_replace ( '* ' , '[*] ' , $ pattern );
795
795
$ pattern = str_replace ( '? ' , '[?] ' , $ pattern );
796
796
797
- $ glob_pattern = '' ;
798
- for ( $ i = 0 ; $ i < strlen ( $ pattern ); $ i += 1 ) {
799
- $ byte1 = $ pattern [ $ i ];
800
- if ( '\\' === $ byte1 ) {
801
- // Add the escape character.
802
- $ glob_pattern .= $ byte1 ;
803
-
804
- // Special case: "\\%" and "\\_" are equivalent to "\%" and "\_".
805
- // In such case, we need to skip the extra backslash.
806
- $ byte2 = $ pattern [ $ i + 1 ] ?? null ;
807
- $ byte3 = $ pattern [ $ i + 2 ] ?? null ;
808
- if ( '\\' === $ byte2 && ( '% ' === $ byte3 || '_ ' === $ byte3 ) ) {
809
- $ glob_pattern .= $ byte3 ;
810
- $ i += 2 ;
811
- continue ;
812
- }
813
-
814
- // We're in an escape sequence. Add the next character as it is.
815
- $ glob_pattern .= $ byte2 ;
816
- $ i += 1 ;
817
- } elseif ( '% ' === $ byte1 ) {
818
- $ glob_pattern .= '* ' ;
819
- } elseif ( '_ ' === $ byte1 ) {
820
- $ glob_pattern .= '? ' ;
821
- } else {
822
- $ glob_pattern .= $ byte1 ;
823
- }
824
- }
797
+ $ pattern = preg_replace ('/(^|[^ \\\\](?: \\\\{2}))*( \\\\[%_])/ ' , '$1 \\\\$2 ' , $ pattern );
825
798
826
799
// 1. Unescape C-style escape sequences.
827
- $ glob_pattern = stripcslashes ($ glob_pattern );
800
+ $ pattern = stripcslashes ($ pattern );
828
801
829
- // 2. Unescape LIKE escape sequences.
830
- $ glob_pattern = preg_replace ('/ \\\\(.) / ' , '$1 ' , $ glob_pattern );
802
+ $ pattern = preg_replace ( ' /(^|[^ \\\\ ](?: \\\\ {2})*)%/ ' , ' $1* ' , $ pattern );
803
+ $ pattern = preg_replace ('/(^|[^ \\\\](?: \\\\ {2})*)_ / ' , '$1? ' , $ pattern );
831
804
832
- return $ glob_pattern ;
805
+ // 2. Unescape LIKE escape sequences.
806
+ $ pattern = preg_replace ('/ \\\\(.)/ ' , '$1 ' , $ pattern );
807
+
808
+ return $ pattern ;
833
809
}
834
810
}
0 commit comments