对于早期版本的 PHP,您可以使用以下代码段为 str_contains 函数提供垫片
<?php
// 基于 PHP Laravel 框架的原始作品
if (!function_exists('str_contains')) {
function str_contains($haystack, $needle) {
return $needle !== '' && mb_strpos($haystack, $needle) !== false;
}
}
?>
(PHP 8)
str_contains — 确定字符串是否包含给定的子字符串
haystack
要搜索的字符串。
needle
要在 haystack
中搜索的子字符串。
示例 #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
注意: 此函数是二进制安全的。
对于早期版本的 PHP,您可以使用以下代码段为 str_contains 函数提供垫片
<?php
// 基于 PHP Laravel 框架的原始作品
if (!function_exists('str_contains')) {
function str_contains($haystack, $needle) {
return $needle !== '' && mb_strpos($haystack, $needle) !== false;
}
}
?>
基于 PHP Laravel 框架的原始作品的垫片具有不同的行为;
当 $needle 为 `""` 或 `null` 时
php8 将返回 `true`;
但是,laravel 的 str_contains 将返回 `false`;
在 php8.1 中,null 已弃用,您可以使用 `$needle ?: ""`;
几个用于检查字符串是否包含数组中的任何字符串或所有字符串的函数
<?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 中的任何一个/所有中的版本。)
如果您的针头不是 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 中的 ド 将匹配上述字符串中的 ド。因此,最好还是先将参数的编码转换为相同的编码。但是,如果字符集未知/无法检测到,并且您别无选择,只能处理脏数据,那么这可能是最简单的解决方案。
来自 "me at daz dot co dot uk" 的代码如果单词位于以下位置将无法正常工作
- 字符串开头
- 字符串结尾
- 句末(例如 "the ox." 或 "is that an ox?")
- 引号内
- 等等。
您应该通过空格、标点符号等来分割字符串,并检查结果数组是否包含您的单词,或者尝试使用以下正则表达式进行测试
(^|[\s\W])+word($|[\s\W])+
免责声明:正则表达式可能需要一些调整
<?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;
}
}
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);
}
在 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
<?php
$needle = '@';
$haystack = '[email protected]';
if (!str_contains($haystack, $needle)){
echo '干草堆中没有 @';
}else{
echo '干草堆中有一个 @';
}