【问题标题】:How to perform case insensitive str_contains?如何执行不区分大小写的 str_contains?
【发布时间】:2020-11-17 03:54:27
【问题描述】:

我的代码中有很多if(mb_stripos($hay, $needle) !== false)。如何将其替换为str_contains()

例如,我的代码中有这个辅助函数:

<?php

$str1 = 'Hello world!'; //coming from the database
$str2 = 'hello'; // coming from $_GET user input

function str_contains_old(string $hay, string $needle):bool {
    return mb_stripos($hay, $needle) !== false;
}

var_dump(str_contains_old($str1, $str2)); // gives bool(true)

如何使它与新的str_contains() 一起工作?

var_dump(str_contains($str1, $str2)); // gives bool(false)

Demo

【问题讨论】:

  • 考虑到那还没有出来(看起来它甚至是从 php 手册站点中拉出来的??)....它的行为可能会在它实现时发生变化。最后我读到“没有不区分大小写的变体”。
  • 这里最糟糕的情况是,您是继续使用我们几十年来一直在做的 stripos... 还是将输入包装在 strtolower() 中,以便比较两个相同的大小写字符串 :( 两者同样丑陋。
  • 未来可能会添加:“关于此功能不区分大小写:这可能是未来的功能”
  • 是的,Stack Overflow,这是 PHP8 发布的函数php.net/manual/en/function.str-contains.php

标签: php php-8


【解决方案1】:

您需要不区分大小写的str_contains() 简短的回答是:没有。

长答案是:区分大小写取决于编码和区域设置。当您将这些信息添加到假设的str_icontains() 时,您已经重新创建了mb_stripos()。 TL;DR - 不要这样做。

【讨论】:

    【解决方案2】:

    我个人会先将输入转为小写,然后进行比较,所以大小写无关紧要。除非您使用特殊字符,否则这基本上应该在大多数情况下都有效。

    <?php
    function str_icontains($haystack, $needle) {
    $smallhaystack = strtolower($haystack);  // make the haystack lowercase, which essentially makes it case insensitive
    $smallneedle = strtolower($needle);  // makes the needle lowercase, which essentially makes it case insensitive
    if (str_contains($smallhaystack, $smallneedle)) {  // compares the lowercase strings
    return 'true';  // returns true (wow)
    } else {
    return 'false';  // returns false (wow)
    }
    }
    
    echo str_icontains('HElLo', 'ell'); // true
    echo str_icontains('Lorem', 'iPsum'); // false
    echo str_icontains('TOBIAGAMESYT', 'bIaG'); // true
    ?>
    

    Sandbox

    【讨论】:

    • 试试echo str_icontains('ć', 'Ć');
    【解决方案3】:

    我有一个技巧。

    if(is_int(stripos("Hello good world", "HELLO"))){
        echo "contains";
    }
    else{
        echo "not contains";
    };
    

    o/p: 包含

    【讨论】:

    • 我不明白这如何回答这个问题。这个黑客有什么作用?
    • 这个 > var_dump(str_contains($str1, $str2)); >> 不区分大小写,This > var_dumps(is_int(stripos($str1, $str2))) >> 不区分大小写
    • 这不是和我所拥有的一样,但只适用于字节字符串吗?
    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2013-03-06
    • 2011-10-14
    • 2012-02-03
    • 2019-06-26
    相关资源
    最近更新 更多