Domanda

Sulla mia pagina di registrazione ho bisogno di validare i nomi utente come alfanumerico solo, ma anche di sottolineatura opzionali. Mi è venuta in mente questo:

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^\w+$/',$str);
}

che sembra funzionare bene, ma io non sono un esperto di regex! Qualcuno individuare alcun problema?

È stato utile?

Soluzione

L'attuale abbinato caratteri di \w dipendono dalla localizzazione che viene utilizzato:

  

"parola" Un personaggio è alcuna lettera o cifra o il carattere di sottolineatura, cioè, qualsiasi carattere che può essere parte di un Perl " parola ". La definizione di lettere e numeri è controllata da tabelle dei caratteri PCRE, e può variare in base a specifiche delle impostazioni avviene. Ad esempio, nel locale "fr" (francese), alcuni codici di carattere maggiore di 128 sono utilizzati per le lettere accentate, e questi sono accompagnati da \ w.

Così si dovrebbe meglio specificare esplicitamente quali caratteri si desidera consentire:

/^[A-Za-z0-9_]+$/

In questo modo i caratteri alfanumerici e solo il carattere di sottolineatura.

E se si desidera consentire sottolineatura solo come carattere di concatenazione e vuole forzare che il nome utente deve iniziare con un carattere alfabeto:

/^[A-Za-z][A-Za-z0-9]*(?:_[A-Za-z0-9]+)*$/

Altri suggerimenti

Ecco una funzione personalizzata per convalidare la stringa utilizzando il PHP ctype_alnum in combinazione con una serie di caratteri consentiti:

<?php

$str = "";
function validate_username($str) {

  // each array entry is an special char allowed
  // besides the ones from ctype_alnum
  $allowed = array(".", "-", "_");

  if ( ctype_alnum( str_replace($allowed, '', $str ) ) ) {
    return $str;
  } else {
    $str = "Invalid Username";
    return $str;
  }
}

?>

try

function validate_alphanumeric_underscore($str) 
{
    return preg_match('/^[a-zA-Z0-9_]+$/',$str);
}

guarda bene a me. Si noti che si fanno alcun obbligo per il posizionamento della sottolineatura, in modo da "username_" e "___username" sarebbero entrambi passaggio.

Vorrei prendere regex secondaria di gumbo, per consentire solo sottolineatura come concatenazione, ma aggiungere un + dopo la _ in modo che un utente può essere come "special__username", solo un tweak minore.

/^[A-Za-z][A-Za-z0-9]*(?:_+[A-Za-z0-9]+)*$/

La tua soluzione è perfettamente bene.

preg_match utilizza espressioni regolari Perl-like, in cui il \w classe di caratteri definito in modo da corrispondere esattamente quello che vi serve:

  

\w - Partita un carattere "parola" (alfanumerico più "_")

( fonte )

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top