<? Php /* PHP implementation of string matching KMP algorithm */ Function KMP ($ str ){ $ K = array (0 ); $ M = 0; $ StrLen = strlen ($ str ); For ($ I = 1; $ I <$ strLen; $ I ++ ){ If ($ str [$ I] ==$ str [$ M]) { $ K [$ I] = $ K [$ i-1] + 1; $ M ++; } Else { $ M = 0; $ K [$ I] = $ K [$ M]; } } Return $ K; } // KMP search Function KMPMatch ($ src, $ par ){ $ K = KMP ($ par ); $ SrcLen = strlen ($ src ); $ ParLen = strlen ($ par ); For ($ I = 0, $ j = 0; $ I <$ srcLen ;){ // Returns the exact matched position. If ($ j = $ parLen) return $ I-$ j; // Print the matching process Echo $ I. "". $ j. "{$ src [$ I]}-{$ par [$ j]} <BR> "; If ($ par [$ j] ===$ src [$ I]) { // Record matching count $ J ++; $ I ++; } Else { If ($ j = 0 ){ $ I ++; } $ J = $ K [$ J-1> = 0? $ J-1: 0]; } } Return false; } // Test availability $ Src = 'BBC ABCDAB abcdababd '; $ Par = 'ABCD '; // Matching value Echo "partially matched values:", implode ("", KMP ($ par), "<BR> "; // Search for specific characters (strings) in a given string) Echo KMPMatch ($ src, $ par), "<BR> "; /* Partial matching value: 0 0 0 0 1 2 0 0 0 B-A B-A 1 0 C-A 2 0 3 0- 4 0 A-A 1 B-B 6 2 C-C 7 3 D-D 8 4 A-A 9 5 B-B 10 6-D 10 2-C 10 0- A-A 11 0 12 B-B C-C 13 2 14 3 D-D 15 4 A-A 16 5 B-B C-D 17 6 17 2 C-C 18 3 D-D 19 A-A 20 5 B-B D-D 21 6 15 */ |