php strrpos 字符串查找函数内部源码实现

此函数strrpos从字符串的末尾开始查找所需要查找的字符。其他内部实现和strpos差不多是一样的。

/* {{{ 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;
}

你可能感兴趣的:(php strrpos 字符串查找函数内部源码实现)