Heim  >  Artikel  >  Backend-Entwicklung  >  Eingehende Analyse der strpos-Funktion in PHP

Eingehende Analyse der strpos-Funktion in PHP

不言
不言Original
2018-07-28 10:10:012129Durchsuche

Der Inhalt dieses Artikels soll Ihnen eine ausführliche Analyse der strpos-Funktion in PHP geben. Ich hoffe, dass er Ihnen helfen kann.

Übersicht

In PHP wird strpos häufig verwendet, um festzustellen, ob eine Zeichenfolge in einer anderen Zeichenfolge vorhanden ist. In diesem Artikel werden die Funktion strpos und ihre Implementierung vorgestellt.

strpos apply

<?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;);
Warnung: Die Funktion strpos gibt möglicherweise einen booleschen Wert FALSE zurück, kann aber auch einen nicht booleschen Wert zurückgeben, der <🎜 entspricht >. Weitere Informationen finden Sie im Kapitel Boolesche Typen. Der Rückgabewert dieser Funktion sollte mit dem Operator FALSE getestet werden. ===
strpos-Serienfunktionen

mb*-bezogene Funktionen sind ebenfalls verfügbar. Beispielsweise führt mb_strpos eine mehrbytesichere strpos()-Operation basierend auf der Anzahl der Zeichen aus.
PHP(strpos)-Quellcode

strpos(ext/standard/string.c)

  • PHP-Quellcode-Adresse

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-Quellcode-Adresse

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

  • PHP-Quellcode-Adresse

/*
 * 此函数的作用是在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 – Quellcode-Adresse

  • /*
    头文件:#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 – Quellcode-Adresse

    /* 字符串函数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
    Tipp

    Bei der strpos-Funktion wird die Groß-/Kleinschreibung beachtet.

    Verwandte Empfehlungen:

    Anwendung des Sperrmechanismus in PHP

    So verschlüsseln Sie die PHP-ID

    Das obige ist der detaillierte Inhalt vonEingehende Analyse der strpos-Funktion in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
函数描述版本
strpos查找字符串首次出现的位置PHP 4, PHP 5, PHP 7
stripos查找字符串首次出现的位置(不区分大小写)PHP 5, PHP 7
strrpos计算指定字符串在目标字符串中最后一次出现的位置PHP 4, PHP 5, PHP 7
strripos计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)PHP 5, PHP 7
mb_strpos查找字符串在另一个字符串中首次出现的位置PHP 4 >= 4.0.6, PHP 5, PHP 7
strstr 查找字符串的首次出现 PHP 4, PHP 5, PHP 7
stristr strstr() 函数的忽略大小写版本 PHP 4, PHP 5, PHP 7
substr_count 计算字串出现的次数 PHP 4, PHP 5, PHP 7