Nasıl bir düzenli ifade eşleşmesi başarısız karakterler listesini görüntüleyebilir?

5 Cevap php

Örneğin, bazı form giriş doğrulama yapıyorum ve ben name alan için aşağıdaki kodu kullanarak yaşıyorum.

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

Birisi türleri Mr. (Awkward) Double-Barrelled Söylediğim bir mesaj görüntülemek edebilmek istiyorsanız Invalid character(s): (, )

5 Cevap

You can fetch all occurences of characters that are not within your character-class.
Negate the class [...] -> [^...] and then fetch all matches.

$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";
  }
}

açıklanan PREG_OFFSET_CAPTURE seçeneği kullanarak http://docs.php.net/preg_match_all bile kullanıcıyı where o karakter girişi olduğunu söyleyebilirim.

edit: Or you can use preg_replace_callback() to visually mark the invalid characters somehow. e.g (using an anonymous function/closure, 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;
}

baskılar invalid characters: "(, )" in your input: Mr. [(]Awkward[)] Double-Barrelled

Sen tüm yasadışı karakter almak için ([^a-zA-Z .-]) için giriş arayabilirsiniz.

preg_match("/[^a-zA-Z0-9\s\.\-]/", $text) hile yapmak gerekir. . Gerçekten ',' kaçmak gerekiyordu 've' konum - 'karakteri. Ben şahsen karakterler geçersiz olduğu anlamaya israf boşluk rahatsız olmaz. Daha sonra onlar için hiçbir umut yoktur: kişi '(ne olursa olsun) İzin Karakterler' diyerek bir beyanı esas onu anlamaya yapamıyorsanız.

İşte list of regex characters da supposed kaçmak için konum karakterlerin bir listesini içeren bulunuyor.

Ayrıca sadece "şey" ile geçerli karakterleri değiştirebilirsiniz - dinlenme, eğer varsa, geçersiz olacaktır.

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

Sen izin karakterleri birlikte bölünmüş olabilir:

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

... Ve kalan bütün karakterlerin bir listesini almak.