【问题标题】:How to check if a string is in an array?如何检查字符串是否在数组中?
【发布时间】:2010-07-20 01:43:55
【问题描述】:

我基本上需要一个函数来检查一个字符串的字符(每个字符)是否在一个数组中。

到目前为止,我的代码还不能正常工作,但无论如何都可以,

$allowedChars = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"," ","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","0","1","2","3","4","5","6","7","8","9"," ","@",".","-","_","+"," ");

$input = "Test";
$input = str_split($input);

if (in_array($input,$allowedChars)) {echo "Yep, found.";}else {echo "Sigh, not found...";}

我希望它说“是的,找到了。”如果在 $allowedChars 中找到 $input 中的字母之一。很简单,对吧?好吧,那是行不通的,而且我还没有找到一个函数可以在字符串的各个字符中搜索数组中的值。

顺便说一句,我希望它只是那些数组的值,我不是在寻找花哨的 html_strip_entities 或其他任何东西,我想将那个确切的数组用于允许的字符。

【问题讨论】:

    标签: php arrays string


    【解决方案1】:

    你真的应该研究一下正则表达式和 preg_match 函数:http://php.net/manual/en/function.preg-match.php

    但是,这应该可以满足您的特定要求:

    $allowedChars = array("a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"," ","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","0","1","2","3","4","5","6","7","8","9"," ","@",".","-","_","+"," ");
    $input = "Test";
    $input = str_split($input);
    $message = "Sigh, not found...";
    foreach($input as $letter) {
        if (in_array($letter, $allowedChars)) {
            $message = "Yep, found.";
            break;
        }
    }
    echo $message;
    

    【讨论】:

      【解决方案2】:

      你熟悉正则表达式吗?这是一种更被接受的做你想做的事情的方式,除非我在这里遗漏了什么。

      看看preg_match():http://php.net/manual/en/function.preg-match.php

      为了解决您的示例,这里有一些示例代码(已更新以解决评论中的问题):

      $subject = "Hello, this is a string";
      $pattern = '/[a-zA-Z0-9 @._+-]*/'; // include all the symbols you want to match here
      
      if (preg_match($pattern, $subject))
          echo "Yep, matches";
      else
          echo "Doesn't match :(";
      

      正则表达式的一点解释:'^' 匹配字符串的开头,'[a-zA-Z0-9 @._+-]' 部分表示“此集合中的任何字符”,' *' 后面的意思是“零个或多个最后一件事”,最后的 '$' 匹配字符串的结尾。

      【讨论】:

      • 啊,谢谢,但是当我运行它时,它说 - 在下划线之前给它一个错误:(为什么会这样?不,我不熟悉 RegEx :P,我听说过它,但我不能做任何值得的事情:P
      • 这不是他想要的。请参阅“如果在 $input 中找到某个字母”。要解决此问题,请删除“^”和“$”。
      • 嗯,我已经做到了,但它仍然给我这个错误:警告:preg_match() [function.preg-match]: Unknown modifier '-' in /home/jaxo/web/tests /test.php上线(与preg_match语句行)
      • 如何使用像 [:graph:] 这样的 posix 字符类匹配,从外观上看 [:blank:] 或 [:space:] 对于所有这些,请参阅 wikipedia
      • 对,对不起;我只是写了它,没有过多考虑表达式。是的,“-”在字符类中是无效的,除非它出现在开头或结尾(我已将其移至答案的末尾)。抱歉,添麻烦了。 :\
      【解决方案3】:

      有点不同的方法:

      $allowedChars = array("a","b","c","d","e");
      $char_buff = explode('', "Test");
      $foundTheseOnes = array_intersect($char_buff, $allowedChars);
      if(!empty($foundTheseOnes)) {
          echo 'Yep, something was found. Let\'s find out what: <br />';
          print_r($foundTheseOnes);
      }
      

      【讨论】:

        【解决方案4】:

        验证字符串中的字符最适合使用字符串函数。
        preg_match() 是完成此任务的最直接/最优雅的方法。

        代码:(Demo)

        $input="Test Test Test Test";
        if(preg_match('/^[\w +.@_-]*$/',$input)){
            echo "Input string does not contain any disallowed characters";
        }else{
            echo "Input contains one or more disallowed characters";
        }
        // output: Yes, input contains only allowed characters
        

        模式说明:

        /          # start pattern
        ^          # start matching from start of string
        [\w +.@-]  # match: a-z, A-Z, 0-9, underscore, space, plus, dot, atsign, hyphen
        *          # zero or more occurrences
        $          # match until end of string
        /          # end pattern
        

        要点:

        • ^$ 锚点对于确保验证整个字符串而非仅验证字符串的子字符串至关重要。
        • \w(又名“任何单词字符”-> shorthand character class)是一种简单的书写方式:[a-zA-Z0-9_]
        • . dot character 失去了“匹配任何东西(几乎)”的含义,当它写在字符类中时变成字面意思。不需要转义斜线。
        • character class 中的连字符可以不使用转义斜杠 (\-),只要它位于字符类的开头或结尾即可。如果连字符不在开头/结尾且未转义,它将在其任一侧的字符之间创建一个字符范围。
          无论喜欢与否,[.-z] 将不匹配连字符,因为它不存在于ascii table 上的点字符和小写字母 z 之间。
        • 字符类后面的* 是“quantifier”。星号表示前面字符类的“0 个或多个”。在这种情况下,这意味着preg_match() 将允许一个空字符串。如果你想拒绝一个空字符串,你可以使用+,它表示前面的字符类的“1 个或多个”。最后,您可以通过在花括号表达式中使用一个或多个数字来更具体地了解字符串长度。
          • {8} 表示字符串长度必须正好为 8 个字符。
          • {4,} 表示字符串必须至少有 4 个字符长。
          • {,10} 表示字符串长度必须在 0 到 10 之间。
          • {5,9} 表示字符串长度必须在 5 到 9 个字符之间。

        除了所有这些建议之外,如果您绝对必须使用您的字符数组并且您想使用循环来根据您的验证数组检查单个字符(我当然不推荐它),那么目标应该是减少涉及的数组元素的数量,从而减少总迭代次数。

        • 您的$allowedChars 数组有多个包含空格字符的元素,但只有一个是必需的。您应该使用array_unique() 或类似技术准备阵列。
        • str_split($input) 将有机会生成具有重复元素的数组。例如,如果 $input="Test Test Test Test"; 则来自 str_split() 的结果数组将有 19 个元素,其中 14 个元素需要冗余验证检查。
        • 您可以通过调用count_chars($input,3) 并将其提供给str_split() 来消除str_split() 的冗余,或者您可以在执行迭代过程之前调用str_split() 然后array_unique()

        【讨论】:

        • 这是一个很好的答案,但我在 7 年前问过这个问题!不过,我希望它对将来的某些人有所帮助。
        • 是的,这就是我想要的。干杯。
        【解决方案5】:

        因为您只是在验证字符串,请参阅 preg_match() 和其他 PCRE 函数来处理此问题。

        或者,您可以使用strcspn() 来做...

        $check = "abcde.... '; // 填写其余字符 $test = "测试"; echo ((strcspn($test, $check) === strlen($test)) ? "Sigh, not found..." : '是的,找到了。');

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-12-18
          • 2017-03-17
          • 1970-01-01
          • 1970-01-01
          • 2020-03-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多