成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

深入理解PHP之strpos

cheukyin / 2209人閱讀

摘要:應(yīng)使用運(yùn)算符來(lái)測(cè)試此函數(shù)的返回值。返回值如果找到指定的字節(jié)則返回該字節(jié)的指針,否則返回。內(nèi)核版源碼地址字符串函數(shù)原型功能比較內(nèi)存區(qū)域和的前個(gè)字節(jié)說(shuō)明當(dāng)時(shí),返回值當(dāng)時(shí),返回值當(dāng)時(shí),返回值提示函數(shù)對(duì)大小寫敏感。

概述

在php中經(jīng)常用 strpos 判斷字符串是否在另一個(gè)字符串中存在, 本文介紹 strpos 函數(shù)及其實(shí)現(xiàn)。

strpos應(yīng)用

Warning: strpos 函數(shù)可能返回布爾值 FALSE,但也可能返回等同于 FALSE 的非布爾值。請(qǐng)閱讀 布爾類型章節(jié)以獲取更多信息。應(yīng)使用 === 運(yùn)算符來(lái)測(cè)試此函數(shù)的返回值。
strpos系列函數(shù)
函數(shù) 描述 版本
strpos 查找字符串首次出現(xiàn)的位置 PHP 4, PHP 5, PHP 7
stripos 查找字符串首次出現(xiàn)的位置(不區(qū)分大小寫) PHP 5, PHP 7
strrpos 計(jì)算指定字符串在目標(biāo)字符串中最后一次出現(xiàn)的位置 PHP 4, PHP 5, PHP 7
strripos 計(jì)算指定字符串在目標(biāo)字符串中最后一次出現(xiàn)的位置(不區(qū)分大小寫) PHP 5, PHP 7
mb_strpos 查找字符串在另一個(gè)字符串中首次出現(xiàn)的位置 PHP 4 >= 4.0.6, PHP 5, PHP 7
strstr 查找字符串的首次出現(xiàn) PHP 4, PHP 5, PHP 7
stristr strstr() 函數(shù)的忽略大小寫版本 PHP 4, PHP 5, PHP 7
substr_count 計(jì)算字串出現(xiàn)的次數(shù) PHP 4, PHP 5, PHP 7
mb* 相關(guān)的函數(shù)也可, 比如說(shuō)mb_strpos是基于字符數(shù)執(zhí)行一個(gè)多字節(jié)安全的 strpos() 操作。
PHP(strpos)源碼 strpos(ext/standard/string.c)

PHP源碼地址

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源碼地址

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

PHP源碼地址

/*
 * 此函數(shù)的作用是在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)) {
        // 第一個(gè)優(yōu)化,只查找end - needle_len次
        end -= needle_len;

        while (p <= end) {
            // 第二個(gè)優(yōu)化,先判斷字符串的開頭和結(jié)尾是否一樣再判斷整個(gè)字符串
            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內(nèi)核版-源碼地址

/*
頭文件:#include 

定義函數(shù):void * memchr(const void *s, char c, size_t n);

函數(shù)說(shuō)明:memchr()從頭開始搜尋s 所指的內(nèi)存內(nèi)容前n 個(gè)字節(jié),直到發(fā)現(xiàn)第一個(gè)值為c 的字節(jié),則返回指向該字節(jié)的指針。

返回值:如果找到指定的字節(jié)則返回該字節(jié)的指針,否則返回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內(nèi)核版-源碼地址

/* 字符串函數(shù)memcmp
   原型:extern int memcmp(void *buf1, void *buf2, unsigned int count); 
   功能:比較內(nèi)存區(qū)域buf1和buf2的前count個(gè)字節(jié)
   說(shuō)明:當(dāng)buf1buf2時(shí),返回值>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
提示

strpos函數(shù)對(duì)大小寫敏感。

參考

php strpos官方文檔

字符串查找算法

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29105.html

相關(guān)文章

  • PHPmb_strpos使用

    摘要:第一個(gè)字符的位置是,第二個(gè)字符的位置是,以此類推。和不同的是,數(shù)字的值不會(huì)被當(dāng)做字符的順序值。搜索位置的偏移。如果沒(méi)有提供該參數(shù),將會(huì)使用。負(fù)數(shù)的會(huì)從字符串尾部開始統(tǒng)計(jì)。如果省略,則使用內(nèi)部字符編碼。返回的中首次出現(xiàn)位置的數(shù)值。 mb_strpos (PHP 4 >= 4.0.6, PHP 5, PHP 7) mb_strpos — Find position of first oc...

    B0B0 評(píng)論0 收藏0
  • [譯] 理解 PHP 內(nèi)部函數(shù)的定義(給PHP開發(fā)者的PHP源碼-第二部分)

    摘要:文章來(lái)自原文歡迎來(lái)到給開發(fā)者的源碼系列的第二部分。是在內(nèi)部代表任意一個(gè)變量的定義。這種情況下函數(shù)會(huì)拋出警告,而此函數(shù)馬上返回會(huì)返回給的用戶層代碼。原因是,是少數(shù)通過(guò)而不是擴(kuò)展定義的函數(shù)。下一部分下一部分會(huì)再次發(fā)表在。 文章來(lái)自:http://www.hoohack.me/2016/02/10/understanding-phps-internal-function-definitio...

    hizengzeng 評(píng)論0 收藏0
  • Php常用函數(shù)系列字符串處理

    摘要:規(guī)定要檢查的字符串。遇到這種情況時(shí)可以使用函數(shù)進(jìn)行檢測(cè)。輸出反引用一個(gè)引用字符串函數(shù)示例反引用一個(gè)引用字符串輸出連接分割字符串使用一個(gè)字符串分割另一個(gè)字符串邊界上的分隔字符。應(yīng)使用運(yùn)算符來(lái)測(cè)試返回值函數(shù)示例輸出返回字符串的子串輸入字符串。 轉(zhuǎn)自我的github函數(shù)示例源碼 字符串的格式化 rtrim(),除字符串右端的空白字符或其他預(yù)定義字符 ltrim(),刪除字符串開頭空格或...

    陸斌 評(píng)論0 收藏0
  • [PHP源碼閱讀]strpos、strstr和stripos、stristr函數(shù)

    摘要:例子的值是,因此核心源碼調(diào)用函數(shù)查找如果不是字符串,轉(zhuǎn)換成數(shù)字并賦值為該數(shù)字的字符。設(shè)置結(jié)束字符有一點(diǎn)要注意的是,如果不是字符串的話,會(huì)調(diào)用函數(shù)將轉(zhuǎn)成整型數(shù)字并轉(zhuǎn)換為其值。變量就是調(diào)用函數(shù)時(shí)傳遞的變量。核心源碼拷貝一份調(diào)用函數(shù)找出的值。 我在github有對(duì)PHP源碼更詳細(xì)的注解。感興趣的可以圍觀一下,給個(gè)star。PHP5.4源碼注解。可以通過(guò)commit記錄查看已添加的注解。 st...

    derek_334892 評(píng)論0 收藏0
  • 30秒的PHP代碼片段(3)字符串-String & 函數(shù)-Function

    摘要:返回給定字符串中的元音數(shù)。使用正則表達(dá)式來(lái)計(jì)算字符串中元音的數(shù)量。對(duì)字符串的第一個(gè)字母進(jìn)行無(wú)頭化,然后將其與字符串的其他部分相加。使用查找字符串中第一個(gè)出現(xiàn)的子字符串的位置。相關(guān)文章秒的代碼片段數(shù)組秒的代碼片段數(shù)學(xué) 本文來(lái)自GitHub開源項(xiàng)目 點(diǎn)我跳轉(zhuǎn) 30秒的PHP代碼片段 showImg(https://segmentfault.com/img/bVbnR1I?w=2800&h=...

    BlackMass 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<