Home  >  Article  >  Backend Development  >  In-depth analysis of strpos function in PHP

In-depth analysis of strpos function in PHP

不言
不言Original
2018-07-28 10:10:012118browse

The content of this article is to share with you an in-depth analysis of the strpos function in PHP. The content is very detailed. Friends in need can refer to it. I hope it can help you.

Overview

strpos is often used in PHP to determine whether a string exists in another string. This article introduces the strpos function and its implementation. .

strposApplication

<?php
/* strpos示例 */

// test
echo &#39;match:&#39;, strpos(&#39;xasfsdfbk&#39;, &#39;xasfsdfbk&#39;) !== false ? &#39;true&#39; : &#39;false&#39;, &#39;;&#39;, PHP_EOL;
echo &#39;match:&#39;, strpos(&#39;xasfsdfbk&#39;, &#39;fbk&#39;) !== false ? &#39;true&#39; : &#39;false&#39;, &#39;;&#39;, PHP_EOL;
echo &#39;match:&#39;, strpos(&#39;xasfsdfbk&#39;, &#39;xs&#39;) != false ? &#39;true&#39; : &#39;false&#39;, &#39;;&#39;, PHP_EOL;
echo &#39;match:&#39;, strpos(&#39;xasfsdfbk&#39;, &#39;sfs&#39;) !== false ? &#39;true&#39; : &#39;false&#39;, &#39;;&#39;, PHP_EOL;

// code
strpos(&#39;xasfsdfbk&#39;, &#39;sfs&#39;);
Warning: strpos The function may return a Boolean value FALSE, but may also return the equivalent of # A non-Boolean value for ##FALSE. Please read the Boolean Types chapter for more information. The return value of this function should be tested using the === operator.
strpos series function

FunctionDescriptionVersionstrposFind the first occurrence of a stringPHP 4, PHP 5, PHP 7striposFind the first occurrence of a string (not case sensitive)PHP 5, PHP 7strrposCalculate the specified character The position of the last occurrence of the string in the target stringPHP 4, PHP 5, PHP 7strriposCalculates the position of the specified string in the target The position of the last occurrence in a string (case-insensitive)PHP 5, PHP 7mb_strposFind a string that appears in another string The position of the first occurrence in the stringPHP 4 >= 4.0.6, PHP 5, PHP 7strstrFind the position of the string First appearancePHP 4, PHP 5, PHP 7stristrcase-ignoring version of strstr() function PHP 4, PHP 5, PHP 7substr_countCount the number of occurrences of a stringPHP 4, PHP 5, PHP 7mb* Related functions are also available. For example, mb_strpos performs a multi-byte safe strpos() operation based on the number of characters.
PHP(strpos) source code

strpos(ext/standard/string.c)

  • PHP source code address

PHP_FUNCTION(strpos)
{
    zval *needle;
    zend_string *haystack;
    char *found = NULL;
    char  needle_char[2];
    zend_long  offset = 0;

#ifndef FAST_ZPP
    if (zend_parse_parameters(ZEND_NUM_ARGS(), "Sz|l", &haystack, &needle, &offset) == FAILURE) {
        return;
    }
#else
    ZEND_PARSE_PARAMETERS_START(2, 3)
        Z_PARAM_STR(haystack)
        Z_PARAM_ZVAL(needle)
        Z_PARAM_OPTIONAL
        Z_PARAM_LONG(offset)
    ZEND_PARSE_PARAMETERS_END();
#endif

    if (offset < 0) {
        offset += (zend_long)ZSTR_LEN(haystack);
    }
    if (offset < 0 || (size_t)offset > ZSTR_LEN(haystack)) {
        php_error_docref(NULL, E_WARNING, "Offset not contained in string");
        RETURN_FALSE;
    }

    if (Z_TYPE_P(needle) == IS_STRING) {
        if (!Z_STRLEN_P(needle)) {
            php_error_docref(NULL, E_WARNING, "Empty needle");
            RETURN_FALSE;
        }

        found = (char*)php_memnstr(ZSTR_VAL(haystack) + offset,
                            Z_STRVAL_P(needle),
                            Z_STRLEN_P(needle),
                            ZSTR_VAL(haystack) + ZSTR_LEN(haystack));
    } else {
        if (php_needle_char(needle, needle_char) != SUCCESS) {
            RETURN_FALSE;
        }
        needle_char[1] = 0;

        found = (char*)php_memnstr(ZSTR_VAL(haystack) + offset,
                            needle_char,
                            1,
                            ZSTR_VAL(haystack) + ZSTR_LEN(haystack));
    }

    if (found) {
        RETURN_LONG(found - ZSTR_VAL(haystack));
    } else {
        RETURN_FALSE;
    }
}
php_memnstr(main/php.h)

  • PHP source code address

#define php_memnstr zend_memnstr /* 338 line*/
zend_memnstr(Zend/zend_operators.h)

  • PHP source code address

/*
 * 此函数的作用是在haystack中查找needle,如果不存在返回null,如果存在,返回指向haystack中needle头字符的指针
 */
zend_memnstr(const char *haystack, const char *needle, size_t needle_len, const char *end)
{
    const char *p = haystack;
    const char ne = needle[needle_len-1];
    ptrdiff_t off_p;
    size_t off_s;

    if (needle_len == 1) {
        return (const char *)memchr(p, *needle, (end-p));
    }

    off_p = end - haystack;
    off_s = (off_p > 0) ? (size_t)off_p : 0;

    if (needle_len > off_s) {
        return NULL;
    }

    if (EXPECTED(off_s < 1024 || needle_len < 3)) {
        // 第一个优化,只查找end - needle_len次
        end -= needle_len;

        while (p <= end) {
            // 第二个优化,先判断字符串的开头和结尾是否一样再判断整个字符串
            if ((p = (const char *)memchr(p, *needle, (end-p+1))) && ne == p[needle_len-1]) {
                if (!memcmp(needle, p, needle_len-1)) {
                    return p;
                }
            }

            if (p == NULL) {
                return NULL;
            }

            p++;
        }

        return NULL;
    } else {
        return zend_memnstr_ex(haystack, needle, needle_len, end);
    }
}
memchr(string.h)

  • Linux kernel version-source code Address

  • /*
    头文件:#include <string.h>
    
    定义函数:void * memchr(const void *s, char c, size_t n);
    
    函数说明:memchr()从头开始搜寻s 所指的内存内容前n 个字节,直到发现第一个值为c 的字节,则返回指向该字节的指针。
    
    返回值:如果找到指定的字节则返回该字节的指针,否则返回0。
    */
    
    #ifndef __HAVE_ARCH_MEMCHR
    void *memchr(const void *s, int c, size_t n)
    {
        const unsigned char *p = s;
        while (n-- != 0) {
                if ((unsigned char)c == *p++) {
                return (void *)(p - 1);
            }
        }
        return NULL;
    }
    EXPORT_SYMBOL(memchr);
    #endif
    memcmp(string.h)

    • Linux kernel version-source address

    /* 字符串函数memcmp
       原型:extern int memcmp(void *buf1, void *buf2, unsigned int count); 
       功能:比较内存区域buf1和buf2的前count个字节
       说明:当buf1<buf2时,返回值<0  
             当buf1=buf2时,返回值=0   
             当buf1>buf2时,返回值>0                                        
    */
    #ifndef __HAVE_ARCH_MEMCMP
    #undef memcmp
    __visible int memcmp(const void *cs, const void *ct, size_t count)
    {
        const unsigned char *su1, *su2;
        int res = 0;
    
        for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
            if ((res = *su1 - *su2) != 0)
                break;
        return res;
    }
    EXPORT_SYMBOL(memcmp);
    #endif
    Tip

    The strpos function is case-sensitive.

    Related recommendations:

    Application of the lock mechanism in PHP

    How to encrypt the php ID

    The above is the detailed content of In-depth analysis of strpos function in PHP. For more information, please follow other related articles on the PHP Chinese website!

    Statement:
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn