如何检查字符串中的多个特定字符?

How can I check a string for multiple certain characters?

我有一个字符串,我需要检查它的几个字符。我可以用 strpos(); 做到这一点。但在这种情况下,我需要多次使用 strpose(); 。像这样:

$str = 'this is a test';
if(
   strpos($str, "-") === false &&
   strpos($str, "_") === false &&
   strpos($str, "@") === false &&
   strpos($str, "/") === false &&
   strpos($str, "'") === false &&
   strpos($str, "]") === false &&
   strpos($str, "[") === false &&
   strpos($str, "#") === false &&
   strpos($str, "&") === false &&
   strpos($str, "*") === false &&
   strpos($str, "^") === false &&
   strpos($str, "!") === false &&
   strpos($str, "?") === false &&
   strpos($str, "{") === false &&
   strpos($str, "}") === false 
  )
    { do stuff }

现在我想知道,是否可以使用 regex 来定义我的病情摘要?


编辑:这里有一些例子:

$str = 'foo'     ----I want this output---> true
$str = 'foo!'    -------------------------> false
$str = '}foo'    -------------------------> false
$str = 'foo*bar' -------------------------> false

等等。换句话说,我只想要文本字符:abcdefghi... .

使用否定先行断言。

if (preg_match("~^(?!.*?[-_^?}{\]\[/'@*&#])~", $str) ){
// do stuff
}

仅当字符串不包含任何提到的字符时,这才会执行大括号内的内容。

如果您希望字符串仅包含单词字符和空格。

if (preg_match("~^[\w\h]+$~", $str)){
// do stuff
}

AS @Reizer 提到,

if(preg_match("~^[^_@/'\]\[#&*^!?}{-]*$~", $str)){

将上面的*出现在字符class旁边)替换为+,如果你不想匹配空字符串。

仅适用于字母和空格。

if(preg_match("~^[a-z\h]+$~i", $str) ){

可能是这样的:

function strpos_multi(array $chars, $str) {
  foreach($chars as $char) {
    if (strpos($str, $char) !== false) {
      return false;
    }
  }
  return true;
}

$res = strpos_multi(["-", "_", "@", "/", "'", "]", "[", "#", "&", "*", "^", "!", "?", "{", "}"], $str);
if ($res) {
  //do some stuff
}

您可以使用基本的正则表达式:

$unwantedChars = ['a', '{', '}'];
$testString = '{a}sdf';

if(preg_match('/[' . preg_quote(implode(',', $unwantedChars)) . ']+/', $testString)) {
    print "Contains invalid characters!";
} else {
    print "OK";
}