例如,如果我正在进行一些表单输入验证,并且我在 name
字段中使用以下代码。
preg_match("/^[a-zA-Z .-]$/", $firstname);
如果有人输入Mr. (尴尬)Double-Barrelled
我希望能够显示一条消息,指出无效字符:(, )
最佳答案
您可以获取所有出现的不属于您的字符类的字符。
否定类 [...] -> [^...],然后获取所有匹配项。
$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;
}
打印输入中的无效字符:“(, )”:Mr. [(]Awkward[)] Double-Barrelled
关于php - 如何显示与正则表达式不匹配的字符列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2475595/