如何显示与正则表达式不匹配的字符列表?

时间:2010-03-19 07:24:24

标签: php regex

例如,如果我正在进行某些表单输入验证,并且我在name字段使用以下代码。

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

如果有人输入Mr. (Awkward) Double-Barrelled,我希望能够显示一条消息Invalid character(s): (, )

5 个答案:

答案 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);

...并获取剩余所有字符的列表。