Вы можете выбрать все вхождения персонажей, которые не в вашем классе персонажей.
Отмените класс [...] -> [^ ...] и затем выберите все совпадения.
$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";
}
}
используя флаг PREG_OFFSET_CAPTURE, описанный в http://docs.php.net/preg_match_all, вы даже можете сообщить пользователю , где , что символ находится на входе.
edit: Или вы можете использовать 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