例如,如果我正在进行某些表单输入验证,并且我在name
字段使用以下代码。
preg_match("/^[a-zA-Z .-]$/", $firstname);
如果有人输入Mr. (Awkward) Double-Barrelled
,我希望能够显示一条消息Invalid character(s): (, )
答案 0 :(得分:3)
您可以在角色类中获取不的所有字符。
否定班级[...] - > [^ ...]然后获取所有匹配。
$firstname = 'Mr. (Awkward) Double-Barrelled';
if ( 0 < preg_match_all("/[^a-zA-Z .-]+/", $firstname, $cap) ) {
foreach( $cap[0] as $e ) {
echo 'invalid character(s): ', htmlspecialchars($e), "\n";
}
}
使用http://docs.php.net/preg_match_all中描述的PREG_OFFSET_CAPTURE标志,您甚至可以告诉用户 该字符在输入中的位置。
编辑:或者您可以使用preg_replace_callback()以某种方式直观地标记无效字符。 例如(使用匿名函数/闭包,php 5.3 +)
$firstname = 'Mr. (Awkward) Double-Barrelled';
$invalid = array();
$result = preg_replace_callback("/[^a-zA-Z .-]+/", function($c) use(&$invalid) { $invalid[] = $c[0]; return '['.$c[0].']'; }, $firstname);
if ( $firstname!==$result ) {
echo 'invalid characters: "', join(', ', $invalid), '" in your input: ', $result;
}
打印invalid characters: "(, )" in your input: Mr. [(]Awkward[)] Double-Barrelled
答案 1 :(得分:1)
您可以搜索([^a-zA-Z .-])
的输入以获取所有非法字符。
答案 2 :(得分:1)
preg_match("/[^a-zA-Z0-9\s\.\-]/", $text)
应该做到这一点。你真的应该逃避'','。'和' - '字符。我个人不会浪费空间来弄清楚哪些字符无效。如果这个人无法根据一句话说“允许的角色:(无论如何)”,那么他们就没有希望了。
这是一个list of regex characters,其中还包含了所谓要逃脱的字符列表。
答案 3 :(得分:1)
您也可以简单地用“无”替换有效字符 - 其余部分(如果有的话)将无效。
$badchars = preg_replace(/[a-z0-9 .-]/, "", $input);
if(strlen($badchars))
error
答案 4 :(得分:0)
您可以沿允许的字符分割:
$result = preg_split('/[a-zA-Z .-]+/s', $subject);
...并获取剩余所有字符的列表。