Как я могу отобразить список символов, которые не соответствуют регулярному выражению? - PullRequest
2 голосов
/ 19 марта 2010

Например, если я выполняю некоторую проверку ввода формы и использую следующий код для поля name.

    preg_match("/^[a-zA-Z .-]$/", $firstname);

Если кто-то наберет Mr. (Awkward) Double-Barrelled, я хочу отобразить сообщение: Invalid character(s): (, )

Ответы [ 5 ]

3 голосов
/ 19 марта 2010

Вы можете выбрать все вхождения персонажей, которые не в вашем классе персонажей.
Отмените класс [...] -> [^ ...] и затем выберите все совпадения.

$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

1 голос
/ 19 марта 2010

Вы также можете просто заменить действительные символы на «ничто» - остальные, если таковые имеются, будут недействительными.

 $badchars = preg_replace(/[a-z0-9 .-]/, "", $input);
 if(strlen($badchars))
       error
1 голос
/ 19 марта 2010

preg_match("/[^a-zA-Z0-9\s\.\-]/", $text) должен сделать свое дело. Вы действительно должны избегать символов '', '.' И '-'. Лично я бы не стал тратить впустую пространство, чтобы выяснить, какие символы недопустимы. Если человек не может понять это, основываясь на утверждении «Разрешенные символы: (что угодно)», тогда у них нет надежды.

Вот список символов регулярных выражений , который также включает список символов, которые вы должны убежать.

1 голос
/ 19 марта 2010

Вы можете найти введенные данные для ([^a-zA-Z .-]), чтобы получить все недопустимые символы.

0 голосов
/ 19 марта 2010

Вы можете разделить по разрешенным символам:

$result = preg_split('/[a-zA-Z .-]+/s', $subject);

... и получите список всех оставшихся символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...