簡體   English   中英

如何顯示不匹配正則表達式的字符列表?

[英]How can I display a list of characters that fail to match a regular expression?

例如,如果我正在進行某種形式的輸入驗證,並且正在對name字段使用以下代碼。

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

如果有人輸入Mr. (Awkward) Double-Barrelled我希望能夠顯示一條消息,指出Invalid character(s): (, )

您可以獲取不在字符類中的所有字符。
對類[...]-> [^ ...]求反,然后獲取所有匹配項。

$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你甚至可以告訴其中該字符是在用戶輸入。

編輯:或者,您可以使用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打印invalid characters: "(, )" in your input: Mr. [(]Awkward[)] Double-Barrelled

您可以在輸入中搜索([^a-zA-Z .-])以獲取所有非法字符。

preg_match("/[^a-zA-Z0-9\\s\\.\\-]/", $text)應該可以解決問題。 您真的應該轉義','。'和'-'字符。 我個人不會浪費時間來找出哪些字符無效。 如果這個人不能根據“允許的字符:(任何)”的說法弄清楚,那么他們就沒有希望了。

這是一個正則表達式字符列表,其中還包括您應該轉義的字符列表。

您也可以簡單地用“ nothing”代替有效字符-其余的(如果有的話)將無效。

 $badchars = preg_replace(/[a-z0-9 .-]/, "", $input);
 if(strlen($badchars))
       error

您可以沿允許的字符分割:

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

...並獲得所有剩余字符的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM