此函數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; }