php strrpos 字符串查找函數內部源碼實現

此函數strrpos從字符串的末尾開始查找所須要查找的字符。其餘內部實現和strpos差很少是同樣的。 php

/* {{{ proto int strrpos(string haystack, string needle [, int offset]) 函數

   Finds position of last occurrence of a string within another string */ PHP_FUNCTION(strrpos) {     zval *zneedle;     char *needle, *haystack;     int needle_len, haystack_len;     long offset = 0;     char *p, *e, ord_needle[2];     if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz|l", &haystack, &haystack_len, &zneedle, &offset) == FAILURE) {         RETURN_FALSE;     }     if (Z_TYPE_P(zneedle) == IS_STRING) {         needle = Z_STRVAL_P(zneedle);         needle_len = Z_STRLEN_P(zneedle);     } else {         if (php_needle_char(zneedle, ord_needle TSRMLS_CC) != SUCCESS) {             RETURN_FALSE;         }         ord_needle[1] = '\0';         needle = ord_needle;         needle_len = 1;     }     if ((haystack_len == 0) || (needle_len == 0)) {         RETURN_FALSE;     }     if (offset >= 0) {         if (offset > haystack_len) {             php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset is greater than the length of haystack string");             RETURN_FALSE;         }         p = haystack + offset;         e = haystack + haystack_len - needle_len;     } else {         if (offset < -INT_MAX || -offset > haystack_len) {             php_error_docref(NULL TSRMLS_CC, E_WARNING, "Offset is greater than the length of haystack string");             RETURN_FALSE;         }         p = haystack;         if (needle_len > -offset) {             e = haystack + haystack_len - needle_len;         } else {             e = haystack + haystack_len + offset;         }     }     if (needle_len == 1) {         /* Single character search can shortcut memcmps */         while (e >= p) {             if (*e == *needle) {                 RETURN_LONG(e - p + (offset > 0 ? offset : 0));             }             e--;         }         RETURN_FALSE;     }     while (e >= p) {         if (memcmp(e, needle, needle_len) == 0) {             RETURN_LONG(e - p + (offset > 0 ? offset : 0));         }         e--;     }     RETURN_FALSE; }
相關文章
相關標籤/搜索