Eingehende Analyse der strpos-Funktion in PHP

不言
Freigeben: 2023-04-03 13:24:02
Original
2137 Leute haben es durchsucht

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;);
Nach dem Login kopieren
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;
    }
}
Nach dem Login kopieren
php_memnstr(main/php.h)

  • PHP-Quellcode-Adresse

#define php_memnstr zend_memnstr /* 338 line*/
Nach dem Login kopieren
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);
    }
}
Nach dem Login kopieren
memchr(string.h)

函数描述版本
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