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

时间:2015-07-30 11:16:10

标签: php regex string character

我有一个字符串,我需要检查几个字符。我可以用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...

3 个答案:

答案 0 :(得分:3)

使用否定先行断言。

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

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

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

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

AS @Reizer提到,

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

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

仅限字母和空格。

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

可能是这样的:

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 staff
}