2024 年 PHP 日本大会

substr_compare

(PHP 5, PHP 7, PHP 8)

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

描述

substr_compare(
    字符串 $haystack,
    字符串 $needle,
    整数 $offset,
    ?整数 $length = null,
    布尔值 $case_insensitive = false
): 整数

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

参数

haystack

要比较的主字符串。

needle

要比较的次要字符串。

offset

比较的起始位置。如果为负数,则从字符串末尾开始计数。

length

比较的长度。默认值为 needle 长度与 haystack 长度减去 offset 之间的最大值。

case_insensitive

如果 case_insensitivetrue,则比较不区分大小写。

返回值

如果从 offset 位置开始的 haystack 小于 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 个字符的二进制安全字符串比较

添加笔记

用户贡献笔记 3 个笔记

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
8年前
此函数有效地实现了检查字符串是否以其他字符串开头或结尾的功能

<?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://'));

?>

请注意,这些函数不识别多字节字符集。
To Top