2009-11-22 141 views
4

我想接受来自用户的字符列表作为输入,并拒绝其余的。我可以接受格式化的字符串或查找是否缺少字符/字符串。 但是,我怎样才能接受只有一套字符,而拒绝所有其他字符。我想用preg_match来做到这一点。PHP正则表达式[只接受选定的字符]

例如允许的字符有:a..z,A..Z, - ,'' 用户必须能够以任何顺序输入这些字符。但是他们绝不允许使用除这些角色以外的其他角色。

回答

8

使用否定的字符类:[^ A-ZA-Z- \ W]

这如果用户输入的东西比什么是在该字符类中的其他将只匹配。

if (preg_match('/[^A-Za-z-\w]/', $input)) { /* invalid charcter entered */ } 
+0

谢谢。请您解释\ w – Sadi 2009-11-22 15:35:19

+0

这是标准的单词字符。我使用它有点冗余。如果我没有弄错,我相信它匹配[A-Za-z0-9_](所有字母,数字和下划线)。 – Matt 2009-11-22 15:38:58

+0

@Matt 是的,就是这样。 :) 谢谢 – Sadi 2009-11-22 15:54:50

2

[A-ZA-Z- \ W]

[]括号用于字符组和像一个单个字符。 [...] +等 也az,AZ,0-9定义范围,因此您不必写整个字母表

+0

+1的括号[] :) – Sadi 2009-11-22 15:34:04

+1

哦,你也可以使用\ S匹配空白字符(空格,制表符,换行符等) – Zenon 2009-11-22 15:45:08

1

您可以使用以下正则表达式: ^[a-zA-Z -]+$

^匹配字符串的开头,从而防止匹配字符串123abc的中间。 $类似地匹配字符串的结尾,防止它匹配abc123的中间。
括号与它们内部的每个字符匹配; a-z表示在az之间的每个字符。为了匹配-角色本身,将其放在最后。 ([19-]匹配1,9-; [1-9]匹配19之间的每个字符,并且不匹配-)。
+告诉它匹配之前的一个或多个事物。如果你想要匹配一个空字符串,你可以用*代替+,这意味着0或更多。

欲了解更多信息,请参阅here

+0

@马特:我很清楚这一点。在投票前三思。 – SLaks 2009-11-22 15:15:17

+0

@SLaks 内容翔实,但不完全是答案。 +1 :) 谢谢 – Sadi 2009-11-22 15:32:31

0

,你会寻求在否定^字符类[],规定你允许的字符,然后测试比赛。

$pattern = '/[^A-Za-z\- ]/'; 
if (preg_match($pattern, $string_of_input)){ 
    //return a fail 
} 

//Matt beat me too it...