PHP 查找、截取字符串函數詳解

導語

常常須要對字符串進行查找、截取的處理,會用到 strstrstrrchrstrposstrrpossubstr 等函數,在這裏整理記錄下。php

strstr

string strstr ( string $haystack , mixed $needle [, bool $before_needle = false ] )
返回 haystack 字符串從 needle 第一次出現的位置開始到 haystack 結尾的字符串。

strstr 會查找字符首次出現的位置,並返回其中的一部分,未找到返回 false。示例函數

<?php
$str = 'abcdefabcdef';
echo strstr($str, 'c') . PHP_EOL;// cdefabcdef,返回第一次出現位置後面的字符串,包括c
echo strstr($str, 'c', true);// ab,返回第一次出現位置後面的字符串,不包括c

strrchr

string strrchr ( string $haystack , mixed $needle )
該函數返回 haystack 字符串中的一部分,這部分以 needle 的最後出現位置開始,直到 haystack 末尾。

strrchr 會查找字符最後一次出現的位置,並返回到末尾的部分,未找到返回 false。示例編碼

<php
$str = 'abcdefabcdef';
echo strrchr($str, 'c');// cdef,返回最後一次出現位置後面的字符串,包括c

strpos

mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
返回 needle 在 haystack 中首次出現的數字位置。

strpos 會查找字符首次出現的位置,返回所在位置的數字,未找到返回 false。示例.net

<?php
$str = 'abcdefabcdef';
echo strpos($str, 'e') . PHP_EOL;// 4,字符串位置是從0開始
echo strpos($str, 'e',3) . PHP_EOL;// 4,從第3位開始查找
echo strpos($str, 'e',11);// false,從第11位開始查找

strrpos

int strrpos ( string $haystack , string $needle [, int $offset = 0 ] )
返回字符串 haystack 中 needle 最後一次出現的數字位置。

strrpos 會查找字符最後一次出現的位置,返回所在位置的數字,未找到返回 false。示例code

<?php
$str = 'abcdefabcdef';
echo strrpos($str, 'e') . PHP_EOL;// 10,字符串位置是從0開始
echo strrpos($str, 'e', 4) . PHP_EOL;// 10,從第4位開始查找
echo strrpos($str, 'e', 11) . PHP_EOL;// false,從第11位開始查找
echo strrpos($str, 'e',-5);// 4,從尾部第5位開始查找

substr

string substr ( string $string , int $start [, int $length ] )
返回字符串 string 由 start 和 length 參數指定的子字符串。

substr 根據位置參數,返回截取的字符串,失敗時返回 false。示例ip

<?php
$str = 'abcdefabcdef';
echo substr($str, 0, 5) . PHP_EOL;// abcde,從首部開始截取5位
echo substr($str, 0, -3) . PHP_EOL;// abcdefabc,從首部開始截取-3位
echo substr($str, -2) . PHP_EOL;// ef,從尾部開始截取2位
echo substr($str, -5, 3) . PHP_EOL;// bcd,從尾部第5位開始截取3位
echo substr($str, -5, -1) . PHP_EOL;// bcde,從尾部第5位開始截取-1位

實例及註釋

實例

以上是函數的簡單示例,工做中合理使用會讓咱們事半功倍。下面是獲取郵箱用戶名或者郵箱域名的實例字符串

<?php
$email = '123456@example.com';
// 獲取用戶名
echo strstr($email, '@', true) . PHP_EOL;
echo substr($email, 0, strpos($email, '@')) . PHP_EOL;
echo substr($email, 0, strrpos($email, '@')) . PHP_EOL;// 郵箱中只有一個@,全部 strpos 和 strrpos 相同
// 獲取郵箱域名
echo substr(strstr($email, '@'), 1) . PHP_EOL;
echo substr(strrchr($email, '@'), 1) . PHP_EOL;
echo substr($email, strpos($email, '@') + 1) . PHP_EOL;
echo substr($email, strrpos($email, '@') + 1);// 同上

註釋

  • stristr、stripos、strripos 分別是 strstr、strpos、strrpos 的不區分大小寫版本
  • strpos,7.1.0版本開始支持負數的 offset
  • substr,length 爲負數,那麼 string 末尾處的 length 個字符將會被省略
  • strpos、strrpos ,判斷返回值要用 "===",由於有可能返回等同於 false 的非布爾值
  • strpos、strrpos ,第二個參數必須是字符串類型,若是不肯定最好進行轉換
  • 使用正則函數也能夠對字符串進行查找、截取,不過相同效果的狀況下,正則效率會慢些
  • 若是隻是想確認字符是否存在於字符串中,strpos 比 strstr 效率高
  • mbstring 能夠更好的處理多字節編碼的字符串

參考資料:strstrstrrchrstrposstrrposmbstringget

相關文章
相關標籤/搜索