PHP 查詢、擷取字串函式詳解

haoyq發表於2019-01-09

導語

經常需要對字串進行查詢、擷取的處理,會用到 strstrstrrchrstrposstrrpossubstr 等函式,在這裡整理記錄下。

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。示例

<?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。示例

<?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。示例

<?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 可以更好的處理多位元組編碼的字串

參考資料:strstrstrrchrstrposstrrposmbstring

相關文章