str_contains

(PHP 8)

str_contains确定字符串是否包含给定的子字符串

描述

str_contains(string $haystack, string $needle): bool

执行一个区分大小写的检查,指示 needle 是否包含在 haystack 中。

参数

haystack

要搜索的字符串。

needle

要在 haystack 中搜索的子字符串。

返回值

如果 needlehaystack 中,则返回 true,否则返回 false

示例

示例 #1 使用空字符串 ''

<?php
if (str_contains('abc', '')) {
echo
"检查空字符串的存在将始终返回 true";
}
?>

上面的示例将输出

Checking the existence of the empty string will always return true

示例 #2 显示大小写敏感性

<?php
$string
= 'The lazy fox jumped over the fence';

if (
str_contains($string, 'lazy')) {
echo
"在字符串中找到字符串 'lazy'\n";
}

if (
str_contains($string, 'Lazy')) {
echo
'在字符串中找到字符串 "Lazy"';
} else {
echo
'"Lazy" 未找到,因为大小写不匹配';
}

?>

上面的示例将输出

The string 'lazy' was found in the string
"Lazy" was not found because the case does not match

注释

注意: 此函数是二进制安全的。

参见

  • str_ends_with() - 检查字符串是否以给定的子字符串结尾
  • str_starts_with() - 检查字符串是否以给定的子字符串开头
  • stripos() - 在字符串中查找不区分大小写的子字符串的第一个出现位置
  • strrpos() - 查找子字符串在字符串中最后一次出现的 位置
  • strripos() - 查找不区分大小写的子字符串在字符串中最后一次出现的 位置
  • strstr() - 查找字符串的第一次出现
  • strpbrk() - 在字符串中搜索一组字符中的任何一个
  • substr() - 返回字符串的一部分
  • preg_match() - 执行正则表达式匹配

添加笔记

用户贡献笔记 9 notes

106
scm6079
3 年前
对于早期版本的 PHP,您可以使用以下代码段为 str_contains 函数提供垫片

<?php
// 基于 PHP Laravel 框架的原始作品
if (!function_exists('str_contains')) {
function
str_contains($haystack, $needle) {
return
$needle !== '' && mb_strpos($haystack, $needle) !== false;
}
}
?>
13
aisunny7 dot xy at gmail dot com
2 年前
基于 PHP Laravel 框架的原始作品的垫片具有不同的行为;

当 $needle 为 `""` 或 `null` 时
php8 将返回 `true`;
但是,laravel 的 str_contains 将返回 `false`;

在 php8.1 中,null 已弃用,您可以使用 `$needle ?: ""`;
5
harl at gmail dot com
1 年前
几个用于检查字符串是否包含数组中的任何字符串或所有字符串的函数

<?php
function str_contains_any(string $haystack, array $needles): bool
{
return
array_reduce($needles, fn($a, $n) => $a || str_contains($haystack, $n), false);
}

function
str_contains_all(string $haystack, array $needles): bool
{
return
array_reduce($needles, fn($a, $n) => $a && str_contains($haystack, $n), true);
}
?>

如果 $needles 是一个空数组,则 str_contains_all() 将返回 true。如果您认为这是错误的,请向我展示 $needles 中一个没有出现在 $haystack 中的字符串,然后查找“空真”。

(通过在这些函数的函数体中交换 haystacks 和 needles,您可以创建检查针头是否出现在一组 haystack 中的任何一个/所有中的版本。)
2
Ancyker
11 个月前
如果您的针头不是 UTF-8 但您要在 UTF-8 字符串中查找它,则此函数并不总是产生预期的结果。这对大多数人来说不会是一个问题,但如果您混合了旧数据和新数据,尤其是从文件读取数据时,它可能是一个问题。

这是一个“mb_*”风格的函数,它搜索字符串

<?php
function mb_str_contains(string $haystack, string $needle, $encoding = null) {
return
$needle === '' || mb_substr_count($haystack, $needle, (empty($encoding) ? mb_internal_encoding() : $encoding)) > 0;
}
?>

我使用 mb_substr_count() 而不是 mb_strpos(),因为 mb_strpos() 仍然会将部分字符匹配,因为它正在进行二进制搜索。

我们可以将 str_contains 与上述建议的函数进行比较

<?php
// 一些 Unicode 漢字 (漢字はユニコード)
$string = hex2bin('e6bca2e5ad97e381afe383a6e3838be382b3e383bce38389');

// 一些 Windows-1252 字符 (ãƒ)
$contains = hex2bin('e383');
// ^ file_get_contents() 在 Windows 上用记事本保存为“ANSI”时会生成相同的数据,所以这并不不切实际。在这里使用 hex2bin 的唯一原因是在不使用多个文件的情况下混合字符集。

// 字符串中实际存在的字符。 (ー)
$contains2 = hex2bin('e383bc');

echo
" = 干草堆: ".var_export($string, true)."\r\n";
echo
" = 针:\r\n";
echo
" + Windows-1252 字符\r\n";
echo
" - 结果:\r\n";
echo
" > str_contains: ".var_export(str_contains($string, $contains), true)."\r\n";
echo
" > mb_str_contains: ".var_export(mb_str_contains($string, $contains), true)."\r\n";
echo
" + 有效的 UTF-8 字符\r\n";
echo
" - 结果:\r\n";
echo
" > str_contains: ".var_export(str_contains($string, $contains2), true)."\r\n";
echo
" > mb_str_contains: ".var_export(mb_str_contains($string, $contains2), true)."\r\n";
echo
"\r\n";
?>

输出

= 干草堆: '漢字はユニコード'
= 针
+ Windows-1252 字符
- 结果
> str_contains: true
> mb_str_contains: false
+ 有效的 UTF-8 字符
- 结果
> str_contains: true
> mb_str_contains: true

然而,它并不完全万无一失。例如,Windows-1252 中的 ド 将匹配上述字符串中的 ド。因此,最好还是先将参数的编码转换为相同的编码。但是,如果字符集未知/无法检测到,并且您别无选择,只能处理脏数据,那么这可能是最简单的解决方案。
2
olivertasche+nospam at gmail dot com
3 年前
来自 "me at daz dot co dot uk" 的代码如果单词位于以下位置将无法正常工作
- 字符串开头
- 字符串结尾
- 句末(例如 "the ox." 或 "is that an ox?")
- 引号内
- 等等。

您应该通过空格、标点符号等来分割字符串,并检查结果数组是否包含您的单词,或者尝试使用以下正则表达式进行测试
(^|[\s\W])+word($|[\s\W])+

免责声明:正则表达式可能需要一些调整
1
juliyvchirkov at gmail dot com
3 年前
<?php

// PHP 4 - PHP 7 的垫片,可以在 PHP 8 中安全使用

if (!function_exists('str_contains')) {
function
str_contains (string $haystack, string $needle)
{
return empty(
$needle) || strpos($haystack, $needle) !== false;
}
}
-1
drupalista dot com dot br at gmail dot com
2 年前
private function contains(array $needles, string $type, string $haystack = NULL, string $filename = NULL) : bool {
if (empty($needles)) return FALSE;
if ($filename)
$haystack = file_get_contents($filename);

$now_what = function(string $needle) use ($haystack, $type) : array {
$has_needle = str_contains($haystack, $needle);
if ($type === 'any' && $has_needle)
return ['done' => TRUE, 'return' => TRUE];

if ($type === 'all' && !$has_needle)
return ['done' => TRUE, 'return' => FALSE];

return ['done' => FALSE];
};

foreach ($needles as $needle) {
$check = $now_what($needle);
if ($check['done'])
return $check['return'];
}
return TRUE;
}

function containsAny(array $needles, string $haystack = NULL, string $filename = NULL) : bool {
return self::contains($needles, 'any', $haystack, $filename);
}

function containsAll(array $needles, string $haystack = NULL, string $filename = NULL) : bool {
return self::contains($needles, 'all', $haystack, $filename);
}
-10
AuxData
2 年前
在 PHP 8 发布之前,许多程序员都在编写我们自己的 contain() 函数。我的函数还处理带有逻辑 OR(设置为 '||')的针。
它在这里。

function contains($haystack, $needle, $offset){
$OR = '||';
$result = false;

$ORpos = strpos($needle, $OR, 0);
if($ORpos !== false){ // 针字符串中存在 OR
$needle_arr = explode($OR, $needle);
for($i=0; $i < count($needle_arr); $i++){
$pos = strpos($haystack, trim($needle_arr[$i]), $offset);
if($pos !== false){
$result = true;
break;
}
}
} else {
$pos = strpos($haystack, trim($needle), $offset);
if($pos !== false){
$result = true;
}
}
return($result);
}

调用: contains("Apple Orange Banana", "Apple || Walnut", 0);
返回: true
-53
kadenskinner at gmail dot com
3 年前
<?php

$needle
= '@';
$haystack = '[email protected]';

if (!
str_contains($haystack, $needle)){
echo
'干草堆中没有 @';
}else{
echo
'干草堆中有一个 @';
}
To Top