PHP Conference Japan 2024

substr_compare

(PHP 5, PHP 7, PHP 8)

substr_compare從指定偏移量開始,最多比較 length 個字元的兩個字串,進行二進位安全比較

說明

substr_compare(
    字串 $haystack,
    字串 $needle,
    整數 $offset,
    ?int $length = null,
    bool $case_insensitive = false
): int

substr_compare() 會比較 haystack 字串從 offset 位置開始,最多 length 個字元與 needle 字串的差異。

參數

haystack

被比較的主要字串。

needle

被比較的次要字串。

offset

比較的起始位置。如果是負數,則從字串的尾端開始計算。

length

比較的長度。預設值是 needle 的長度與 haystack 的長度減去 offset 後兩者間較大的值。

case_insensitive

如果 case_insensitivetrue,則比較時不區分大小寫。

返回值

如果 haystackoffset 位置開始的子字串小於 needle,則返回 -1;如果大於 needle,則返回 1;如果相等,則返回 0。如果 offset 等於(PHP 7.2.18、7.3.5 之前)或大於 haystack 的長度,或者設定了 length 且其值小於 0,substr_compare() 會發出警告並返回 false

更新日誌

版本 說明
8.2.0 此函數現在返回 -11,而以前返回的是負數或正數。
8.0.0 length 現在可以為 null。
7.2.18, 7.3.5 offset 現在可以等於 haystack 的長度。

範例

範例 #1 substr_compare() 範例

<?php
echo substr_compare("abcde", "bc", 1, 2); // 0
echo substr_compare("abcde", "de", -2, 2); // 0
echo substr_compare("abcde", "bcg", 1, 2); // 0
echo substr_compare("abcde", "BC", 1, 2, true); // 0
echo substr_compare("abcde", "bc", 1, 3); // 1
echo substr_compare("abcde", "cd", 1, 2); // -1
echo substr_compare("abcde", "abc", 5, 1); // 警告
?>

另請參閱

  • strncmp() - 前 n 個字元的二進位安全字串比較

新增註解

使用者貢獻的註解 3 則註解

31
jimmetry at gmail dot com
11 年前
當您來到這個頁面時,您可能正在尋找更簡單的東西:一個函式,可以檢查較大的字串中是否從特定索引開始存在較小的字串。使用 substr_compare() 來執行此操作可能會使您的程式碼變得雜亂,因為您需要檢查您的字串是否夠長(以避免警告),手動指定短字串的長度,並且像許多字串函式一樣,執行整數比較來回答是非題。

我寫了一個簡單的函式,用來判斷 $str 是否存在於 $mainStr 中。如果指定了 $loc,則 $str 必須從該索引位置開始;否則,將搜尋整個 $mainStr。

<?php

function contains_substr($mainStr, $str, $loc = false) {
if (
$loc === false) return (strpos($mainStr, $str) !== false);
if (
strlen($mainStr) < strlen($str)) return false;
if ((
$loc + strlen($str)) > strlen($mainStr)) return false;
return (
strcmp(substr($mainStr, $loc, strlen($str)), $str) == 0);
}

?>
12
Skyborne
12 年前
注意 `length` 參數:「預設值是 str 的長度與 main_str 的長度減去偏移量之間較大的那個值。」

這 *並非* 你可能預期 (我一直以來都如此) 的 str 長度,所以如果你省略它,你會得到意想不到的結果。範例:

<?php
$hash
= '$5$lalalalalalalala$crypt.output.here';
var_dump(substr_compare($hash, '$5$', 0)); # int(34)
var_dump(substr_compare($hash, '$5$', 0, 3)); # int(0)
var_dump(PHP_VERSION); # string(6) "5.3.14"
?>
8
bishop at php dot net
8 年前
這個函式有效率地實作了檢查字串是否以其他字串開頭或結尾的功能。

<?php

函式 str_begins($haystack, $needle) {
return
0 === substr_compare($haystack, $needle, 0, strlen($needle));
}

函式
str_ends($haystack, $needle) {
return
0 === substr_compare($haystack, $needle, -strlen($needle));
}

var_dump(str_begins('http://example.com', 'https://'));

?>

注意,這些函式不支援多位元組字元集。
To Top