亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍

PHP中strpos、strstr和stripos、stristr函數(shù)分析
來源:易賢網(wǎng) 閱讀:1441 次 日期:2016-08-17 15:39:14
溫馨提示:易賢網(wǎng)小編為您整理了“PHP中strpos、strstr和stripos、stristr函數(shù)分析”,方便廣大網(wǎng)友查閱!

本文為大家分析了 PHP中strpos、strstr和stripos、stristr函數(shù),供大家參考,具體內(nèi)容如下

strpos

mixed strpos ( string $haystack, mixed $needle [, int $offset = 0 ] )

如果offset指定了,查找會從offset的位置開始。offset不能為負(fù)數(shù)。

返回needle第一次出現(xiàn)在haystack的位置。如果在haystack中找不到needle,則返回FALSE。

needle,如果needle不是字符串,它會被轉(zhuǎn)換成整型數(shù)值并賦值為該數(shù)值的ASCII字符。請看下面例子。

例子

$str = "hello";

$pos = strpos($str, 111);

// 111的ASCII值是o,因此$pos = 4

strpos核心源碼

if (Z_TYPE_P(needle) == IS_STRING) {

   if (!Z_STRLEN_P(needle)) {

     php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty needle");

     RETURN_FALSE;

   }

   // 調(diào)用php_memnstr函數(shù)查找needle

   found = php_memnstr(haystack + offset,

              Z_STRVAL_P(needle),

              Z_STRLEN_P(needle),

              haystack + haystack_len);

   } else {

     // 如果不是字符串,轉(zhuǎn)換成數(shù)字并賦值為該數(shù)字的ASCII字符。

     if (php_needle_char(needle, needle_char TSRMLS_CC) != SUCCESS) {

        RETURN_FALSE;

     }

     //設(shè)置結(jié)束字符

     needle_char[1] = 0;

     found = php_memnstr(haystack + offset,

              needle_char,

              1,

              haystack + haystack_len);

   }

}

有一點(diǎn)要注意的是,如果needle不是字符串的話,會調(diào)用php_needle_char函數(shù)將needle轉(zhuǎn)成整型數(shù)字并轉(zhuǎn)換為其ASCII值。

查找函數(shù)

函數(shù)最后返回的是found,php_memnstr函數(shù)實(shí)現(xiàn)了查找的方法。那么再繼續(xù)看看php_memnstr函數(shù)做了什么:

#define php_memnstr zend_memnstr

php_memnstr是函數(shù)zend_memnstr的宏定義,查看zend_memnstr函數(shù)如下:

static inline char *

zend_memnstr(char *haystack, char *needle, int needle_len, char *end)

{

  char *p = haystack;

  char ne = needle[needle_len-1];

  if (needle_len == 1) {

    return (char *)memchr(p, *needle, (end-p));

  }

  if (needle_len > end-haystack) {

    return NULL;

  }

  // 第一個優(yōu)化,只查找end - needle_len次

  end -= needle_len;

  while (p <= end) {

    // 第二個優(yōu)化,先判斷字符串的開頭和結(jié)尾是否一樣再判斷整個字符串

    if ((p = (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;

}

第一個優(yōu)化,因?yàn)?char *)memchr(p, *needle, (end-p+1)是在end – needle_len + 1(即haystack_len+1)中查找,如果p為空,說明needle的第一個字符在p中從未出現(xiàn)過。

strstr

string strstr ( string $haystack, mixed $needle [, bool $before_needle = false ] )

返回needle在haystack中第一次出現(xiàn)的位置到結(jié)束的字符串。

這個函數(shù)的區(qū)分大小寫的。

如果needle在haystack中不存在,返回FALSE。

如果before_needle為true,則返回haystack中needle在haystack第一次出現(xiàn)的位置之前的字符串。

strstr核心源碼

if (found) {

    // 計算出found的位置

    found_offset = found - haystack;

    if (part) {

      RETURN_STRINGL(haystack, found_offset, 1);

    } else {

      RETURN_STRINGL(found, haystack_len - found_offset, 1);

    }

}

strstr函數(shù)的前半部分跟strpos類似,區(qū)別在于strstr函數(shù)在找到位置后,需要返回haystack部分的字符串。part變量就是調(diào)用strstr函數(shù)時傳遞的before_needle變量。

stripos

mixed stripos ( string $haystack, string $needle [, int $offset = 0 ] )

不區(qū)分大小寫的strpos。實(shí)現(xiàn)方式跟下面的類似,主要是使用一份拷貝然后將需要比較的字符串轉(zhuǎn)換成小寫字符后進(jìn)行再進(jìn)行查找。

stristr

string stristr ( string $haystack, mixed $needle [, bool $before_needle = false ] ) 不區(qū)分大小寫的strstr。

核心源碼

// 拷貝一份haystack

haystack_dup = estrndup(haystack, haystack_len);

if (Z_TYPE_P(needle) == IS_STRING) {

  char *orig_needle;

  if (!Z_STRLEN_P(needle)) {

    php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty needle");

    efree(haystack_dup);

    RETURN_FALSE;

  }

  orig_needle = estrndup(Z_STRVAL_P(needle), Z_STRLEN_P(needle));

  // 調(diào)用php_stristr函數(shù)找出orig_needle的值。

  found = php_stristr(haystack_dup, orig_needle,  haystack_len, Z_STRLEN_P(needle));

  efree(orig_needle);

} else {

  if (php_needle_char(needle, needle_char TSRMLS_CC) != SUCCESS) {

    efree(haystack_dup);

    RETURN_FALSE;

  }

  needle_char[1] = 0;

  found = php_stristr(haystack_dup, needle_char,  haystack_len, 1);

}

if (found) {

  found_offset = found - haystack_dup;

  if (part) {

    RETVAL_STRINGL(haystack, found_offset, 1);

  } else {

    RETVAL_STRINGL(haystack + found_offset, haystack_len - found_offset, 1);

  }

} else {

  RETVAL_FALSE;

}

// 釋放變量

efree(haystack_dup);

可以知道,found是從php_stristr中得到的,繼續(xù)查看php_stristr函數(shù):

PHPAPI char *php_stristr(char *s, char *t, size_t s_len, size_t t_len)

{

  php_strtolower(s, s_len);

  php_strtolower(t, t_len);

  return php_memnstr(s, t, t_len, s + s_len);

}

這個函數(shù)的功能就是將字符串都轉(zhuǎn)成小寫之后調(diào)用php_mennstr函數(shù)來查找needle在haystack第一次出現(xiàn)的位置。

總結(jié)

因?yàn)閟trpos/stripos返回的是位置,位置從0開始計算,所以判斷查找失敗都用=== FALSE更適合。

閱讀PHP的源碼收獲挺多,一方面可以知道某個函數(shù)的具體實(shí)現(xiàn)原理是怎樣的,另一方面可以學(xué)習(xí)到一些編程優(yōu)化方案。

以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)php程序設(shè)計有所幫助。

更多信息請查看網(wǎng)絡(luò)編程
易賢網(wǎng)手機(jī)網(wǎng)站地址:PHP中strpos、strstr和stripos、stristr函數(shù)分析
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機(jī)站點(diǎn)

版權(quán)所有:易賢網(wǎng)

亚洲免费不卡_在线视频精品_国产尤物精品_久久久久网址_久久精品91_欧美va天堂在线_狠狠入ady亚洲精品_亚洲午夜精品福利_国产精品草草_午夜精品久久99蜜桃的功能介绍
久久本道综合色狠狠五月| 日韩午夜激情| av成人国产| 99在线热播精品免费99热| 99视频一区| 午夜在线精品偷拍| 久久永久免费| 影音先锋中文字幕一区| 一区二区三区高清视频在线观看| 亚洲免费影视| 激情91久久| 国产精品制服诱惑| 欧美久久久久久久| 99pao成人国产永久免费视频| 中文精品视频| 新67194成人永久网站| 一区二区三区高清视频在线观看| 国产精品一区在线观看| 亚洲欧美影院| 国产精品乱码| 欧美涩涩视频| 久久福利一区| 亚洲黄色大片| 午夜精品999| 国产精品久久777777毛茸茸| 国内精品亚洲| 久久午夜影视| 国产视频在线观看一区| 在线观看日韩av电影| 欧美91大片| 国产女主播一区二区| 亚洲欧洲精品一区二区| 欧美精品v日韩精品v国产精品| 亚洲伦理一区| 精品999在线观看| 欧美成人蜜桃| 久久亚洲精品欧美| 香蕉亚洲视频| 午夜一区不卡| 美日韩免费视频| 午夜亚洲性色福利视频| 亚洲一区二区三区涩| 一区二区三区国产在线| 亚洲国内欧美| 91久久精品国产91久久性色tv| 国产精品sm| 欧美日韩高清在线一区| 欧美二区不卡| 欧美精品七区| 国产主播一区| 伊人蜜桃色噜噜激情综合| 国模吧视频一区| 伊人久久婷婷色综合98网| 亚洲高清免费| 99精品国产在热久久下载| 亚洲黄色天堂| 亚洲中字黄色| 欧美一区二区| 亚洲第一黄色| 国产免费成人| 欧美久久影院| 亚洲日本国产| 亚洲一区二区精品在线观看| 久久免费99精品久久久久久| 欧美精品导航| 91久久黄色| 先锋影音一区二区三区| 欧美黄免费看| 亚洲高清av| 亚洲尤物在线| 国产精品红桃| 一区二区三区国产盗摄| 久久久久久久久久久久久久一区| 葵司免费一区二区三区四区五区| 欧美精品三级| 国产欧美日韩视频一区二区三区| 亚洲欧美久久| 黄色成人在线网址| 国产精品一页| 欧美日韩国产精品一区二区亚洲| 国产精品国产亚洲精品看不卡15| 99国产精品久久久久老师| 久久精品网址| 99re6热在线精品视频播放速度| 欧美综合二区| 亚洲精品乱码视频 | 免费日韩视频| 欧美日本韩国一区二区三区| 在线精品亚洲| 欧美韩国一区| 国产精品女主播一区二区三区| 久久青草久久| 国产偷久久久精品专区| 国产精品v欧美精品v日韩| 国产日韩一区二区三区在线| 国产精品av久久久久久麻豆网| 国产日韩一区欧美| 激情欧美日韩| 欧美性天天影院| 久久综合久久久| 国产麻豆日韩| 国产日韩欧美一区| 亚洲开发第一视频在线播放| 欧美亚韩一区| 欧美一区二区在线| 亚洲欧美日本国产专区一区| 亚洲大胆视频| 激情自拍一区| 亚洲无吗在线| 国产综合精品一区| 欧美视频网站| 国产精品a级| 欧美日韩mv| 国产精品对白刺激久久久| 久久婷婷麻豆| 欧美成人69av| 欧美+日本+国产+在线a∨观看| 国产精品日本一区二区| 亚洲精选久久| 999亚洲国产精| 国产欧美69| 亚洲一区精彩视频| 亚洲一区二区三区精品在线观看 | 国产精品v欧美精品∨日韩| 久久国产福利| 久久久久久久久一区二区| 久久精品女人天堂| 欧美日韩成人| 国产精品亚洲一区| 先锋a资源在线看亚洲| 国产亚洲精品自拍| 欧美综合77777色婷婷| 午夜亚洲激情| 久久久久se| 欧美精品二区| 在线日韩欧美| 国产视频欧美| 久久久福利视频| 久久久久久国产精品mv| 老色鬼久久亚洲一区二区| 欧美一区二区三区四区在线观看地址| 欧美黄在线观看| 一区二区亚洲精品| 国产精品免费区二区三区观看| 欧美一级二区| 亚洲天堂成人| 亚洲欧美网站| 国产一区二区三区自拍| 一区二区亚洲精品| 国产偷久久久精品专区| 久久美女性网| 一本一本久久a久久精品综合妖精| 日韩一级网站| 午夜日韩av| 在线一区日本视频| 久久性色av| 99精品欧美| 欧美aa国产视频| 国产日韩三区| 国产一区再线| 久久久久国内| 99精品热6080yy久久| 欧美黄色精品| 国产一区二区高清| 韩国一区二区三区美女美女秀| 国产精品久久国产愉拍| 国产精品a久久久久| 亚洲免费影视| 一区二区av| 狠狠久久婷婷| 欧美日韩精品免费观看视频完整| 国产亚洲一区在线播放| 极品裸体白嫩激情啪啪国产精品 | 美女久久一区| 日韩视频一区| 国产主播精品| 久久精品女人| 国产欧美日韩一区二区三区| 好看的av在线不卡观看| 欧美尤物一区| 久久国产精品亚洲77777| 日韩亚洲精品在线| 亚洲国产激情| 黑人巨大精品欧美一区二区小视频| 亚洲欧美99| 亚洲女同在线| 亚洲欧美成人| 久久riav二区三区| 国产精品毛片| 在线视频一区观看| 99视频精品| 国产精品久久久久久久久久妞妞 | 国产在线精品二区| 午夜精品久久99蜜桃的功能介绍| 亚洲欧美日韩精品一区二区| 国产亚洲毛片在线| 国产伦理一区| 国产视频一区免费看| 亚洲美女毛片| 在线亚洲自拍| 亚洲免费在线| 久久综合福利| 狠狠色综合网| 亚洲人成免费| 国产精品一二| 久久人人精品| 欧美日韩1区| 亚洲视频在线二区| 亚洲每日在线| 国产精品日韩一区二区| 亚洲综合国产| 午夜视频久久久| 亚洲国产91| 亚洲主播在线| 欧美天天在线| 亚洲久色影视| 亚洲欧美日韩国产一区二区| 久久久久久九九九九| 欧美体内she精视频在线观看| 国产自产精品| 国产日韩精品久久| 久久免费高清| 亚洲国产精品久久久久婷婷老年| 中文久久精品| 久久精品五月| 亚洲成人直播| 久久午夜精品| 一区二区三区国产在线| 亚洲欧美一级二级三级| 亚洲精品偷拍| 葵司免费一区二区三区四区五区| 国产综合视频| 亚洲欧美日韩国产一区二区| 欧美久久影院| 亚洲在线电影| 亚洲黄网站黄| 欧美女人交a| 国产私拍一区| 亚洲国产日韩欧美| 久久亚裔精品欧美| 亚洲精品乱码视频| 欧美日韩一区在线观看视频| 亚洲综合99| 日韩视频二区| 国户精品久久久久久久久久久不卡| 国产欧美69| 亚洲高清在线| 亚洲午夜激情| 欧美激情精品久久久六区热门| 国产视频欧美| 亚洲美女啪啪| 亚洲高清成人| 国产真实久久| 欧美日本久久| 亚洲欧美文学| 久久狠狠婷婷| 国产免费成人| 国产亚洲精品v| 亚洲激情一区| 在线不卡视频| 在线国产欧美| 黄色国产精品| 欧美午夜精品理论片a级大开眼界| 亚洲日本激情| 亚洲福利一区| 亚洲三级免费| 亚洲日本欧美在线| av成人国产| 在线视频欧美一区| 中文精品在线| 亚洲一区亚洲| 久久久精品网| 老司机精品视频网站| 欧美一区1区三区3区公司 | 久久精品导航| 亚欧成人精品| 免费视频久久| 久久久久久久波多野高潮日日| 噜噜噜91成人网| 先锋影音久久| 可以看av的网站久久看| 欧美国内亚洲| 黄色日韩精品| 99视频+国产日韩欧美| 国产日韩一区二区三区| 国产精品美女久久久| 久久久久国内| 午夜精品视频| 亚洲国产一区二区在线| 国产精品一区二区你懂得| 免费亚洲一区二区| 欧美1区3d| 91久久国产综合久久蜜月精品| 亚洲美女视频在线免费观看| 国产免费成人| 国内精品美女在线观看| 在线视频精品一区| 午夜视频一区| 一本综合精品| 欧美精品三级| 国产欧美一区二区视频| 亚洲欧美在线网| 一本色道久久99精品综合| 久久精品五月婷婷| 亚洲激情av| 欧美大香线蕉线伊人久久国产精品| 在线播放豆国产99亚洲| 免播放器亚洲| 亚洲精品1234| 欧美a级在线| 国产日韩一区二区| 韩国自拍一区| 久久伊人亚洲| 国产欧美丝祙| 亚洲福利一区| 欧美精品三区| 久久大逼视频| 一本色道久久综合亚洲精品婷婷 | 亚洲毛片播放| 午夜精品亚洲| 亚洲欧美清纯在线制服| 亚洲二区在线| 欧美激情1区| 香蕉成人久久| 一区二区三区四区五区视频| 欧美午夜久久| 久久久久久精| 亚洲欧美日本国产专区一区| 亚洲三级影院| 精品成人一区| 欧美日韩影院| 欧美一区二区三区在线播放| 亚洲一级在线| 亚洲一级在线| 亚洲一区成人| 国产精品社区| 日韩网站在线| 亚洲免费大片| 亚洲精品视频啊美女在线直播| 老妇喷水一区二区三区| 免费不卡亚洲欧美| 老鸭窝91久久精品色噜噜导演| 国产日韩精品视频一区二区三区| 亚洲黄色精品| 亚洲高清在线播放| 亚洲另类自拍| 国产欧美韩日| 国产视频不卡| 亚洲尤物精选| 久久人人97超碰国产公开结果| 媚黑女一区二区| 久久亚洲一区| 欧美99在线视频观看| 你懂的成人av| 欧美欧美天天天天操| 国产精品激情电影| 黄色免费成人| 亚洲欧洲精品一区二区| 在线综合视频| 久久婷婷人人澡人人喊人人爽| 麻豆av一区二区三区久久| 欧美一区影院| 亚洲视频欧美在线| 亚洲精品影视| 欧美主播一区二区三区美女 久久精品人| 国产精品久久久久久久久婷婷 | 午夜精品婷婷| 亚洲图片欧洲图片日韩av| 亚洲日本视频| 久久国产精品免费一区| 亚洲欧美综合| 亚洲国产精品毛片| 国产乱人伦精品一区二区| 欧美在线免费| 99视频精品| 欧美国产91| 99国产精品99久久久久久粉嫩| 欧美日韩亚洲一区| 99在线精品免费视频九九视| 欧美日韩综合网| 一本一本久久| 久久综合影音| 99伊人成综合| 欧美日韩大片一区二区三区| 亚洲看片一区| 欧美日韩系列| 国产精品一区在线观看| 国产在线一区二区三区四区 | 欧美系列一区| 国产精品久久一区二区三区| 久久久福利视频| 99av国产精品欲麻豆| 欧美在线网站| 亚洲一区二区三区免费观看| 欧美日韩在线一二三| 国产亚洲激情| 亚洲天堂男人| 欧美黄色免费| 久久精品综合| 国产精品美女久久久浪潮软件|