如何检查一个字符串是否在一个数组中?

5
我需要一个函数来检查字符串中的每个字符是否在一个数组中。
目前我的代码还没有达到预期效果,但我还是把它贴出来了。
$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...";}

如果$input中的一个字母在$allowedChars中被找到,我希望它显示“Yep, found.”。简单吧?但是这不起作用,我也没有找到一个函数可以搜索字符串中的单个字符并查找数组中的值。
顺便说一下,我只想使用该数组的值,我不需要什么高级的html_strip_entities之类的东西,我要使用确切的数组作为允许的字符。
5个回答

7

您应该学习正则表达式和preg_match函数:http://php.net/manual/zh/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;

4

你是否了解正则表达式?在这里,正则表达式是更为广泛接受的方法,除非我漏掉了什么。

看一下 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 @._+-]' 代表 "这个集合中的任何字符",之后的 '*' 表示 "零个或多个上一个字符",最后的 '$' 匹配字符串的结尾。


啊,谢谢,但是当我运行它时,它说在下划线前面的破折号会导致错误:(为什么呢?不,我不熟悉正则表达式:P,嗯,我听说过它,但我做不好 :P - Scott
这不是他想要的。请看“如果在$input中找到一个字母”。为了修复它,删除'^'和'$'。 - NawaMan
嗯,我已经做了那个,但它仍然给我这个错误:警告:preg_match() [function.preg-match]:未知修饰符“-”在/home/jaxo/web/tests/test.php的行(带有preg_match语句的行) - Scott
怎么使用 POSIX 字符类匹配,例如 [:graph:],同时根据情况使用 [:blank:] 或者 [:space:] 匹配所有空格字符,可参考 维基百科 - xenoterracide
对不起,我刚才写的时候没有太多考虑表达方式。是的,在字符类中,除非它位于开头或结尾(我已将其移到了答案的结尾),否则'-'是无效的。对造成的麻烦表示抱歉。:\ - Faisal

1

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

代码:(演示)

$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(也称为“任何单词字符” -> 速记字符类)是编写的简便方式:[a-zA-Z0-9_]
  • .点字符在字符类中写入时会失去其“匹配任何内容(几乎)”的含义并变成文本。 不需要转义反斜杠。
  • 字符类的连字符可以在没有转义斜杠(\-)的情况下书写,只要它位于字符类的开头或结尾。 如果连字符不在开头/结尾且未被转义,则会创建介于其两侧字符之间的字符范围。
    无论您喜欢与否,[.-z]将无法匹配连字符符号,因为它不存在于ascii表上的点字符和小写字母z之间。
  • 紧随字符类的*是“量化器”。 星号表示前面的字符类“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()然后array_unique()来消除str_split()中的冗余。

这是一个很好的答案,但我在7年前就问过这个问题了!不过我希望它能帮助未来的某个人。 - Scott
1
是的,这就是我想要的。干杯。 - mickmackusa

1

一种略有不同的方法:

$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);
}

0

因为您只是验证一个字符串,请使用preg_match()和其他PCRE函数来处理。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接