substr_compare

(PHP 5, PHP 7, PHP 8)

substr_compare从偏移量开始,比较两个字符串最多 length 个字符的二进制安全比较

描述

substr_compare(
    string $haystack,
    string $needle,
    int $offset,
    ?int $length = null,
    bool $case_insensitive = false
): int

substr_compare()offset 位置开始,比较 haystackneedle 最多 length 个字符。

参数

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 现在可以为空。
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 个字符的二进制安全字符串比较

添加注释

用户贡献的注释 4 个注释

jimmetry at gmail dot com
11 年前
当您访问此页面时,您可能在寻找更简单的东西:一个可以检查小字符串是否在较大的字符串中从特定索引开始存在的函数。使用 substr_compare() 来实现这一点可能会让您的代码变得混乱,因为您需要检查您的字符串是否足够长(以避免警告),手动指定短字符串的长度,并且像许多字符串函数一样,执行整数比较来回答一个真假问题。

我编写了一个简单的函数,如果 $str 存在于 $mainStr 中,则返回 true。如果指定了 $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);
}

?>
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"
?>
bishop at php dot net
7 年前
此函数有效地实现了检查字符串是否以其他字符串开头或结尾。

<?php

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

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

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

?>

请注意,这些函数不适用于多字节字符集。
sleek
19 年前
原始发布函数的修改版本。请使用此版本

<?php
if (!function_exists('substr_compare')) {
function
substr_compare($main_str, $str, $offset, $length = NULL, $case_insensitivity = false) {
$offset = (int) $offset;

// 由于偏移量无效,发出警告
if ($offset >= strlen($main_str)) {
trigger_error('起始位置不能超过初始字符串长度。', E_USER_WARNING);
return
false;
}

// 我们正在比较每个字符串的前 n 个字符,所以让我们使用 PHP 函数来完成它
if ($offset == 0 && is_int($length) && $case_insensitivity === true) {
return
strncasecmp($main_str, $str, $length);
}

// 获取我们正在比较的子字符串
if (is_int($length)) {
$main_substr = substr($main_str, $offset, $length);
$str_substr = substr($str, 0, $length);
} else {
$main_substr = substr($main_str, $offset);
$str_substr = $str;
}

// 返回两个字符串的不区分大小写的比较
if ($case_insensitivity === true) {
return
strcasecmp($main_substr, $str_substr);
}

// 返回两个字符串的区分大小写的比较
return strcmp($main_substr, $str_substr);
}
}
?>
To Top