2010-02-09 16 views
11

Avere problemi con questo.Determinare se un carattere è alfabetico

Diciamo che ho un parametro composto da un singolo carattere e voglio solo accettare caratteri alfabetici. Come stabilirò che il parametro passato è un membro dell'alfabeto latino (a - z)?

A proposito Im utilizzando PHP Kohana 3.

Grazie.

+0

Si prega di chiarire la domanda: che cos'è un * alfabeti *? Forse intendi un personaggio alfabetico? O un carattere alfanumerico? – wallyk

+0

Oh, ok io sto per essere corretto. Alfabetico dovrebbe essere il termine corretto. Grazie. –

risposta

12

utilizzare la seguente clausola di guardia nella parte superiore del tuo metodo:

if (!preg_match("/^[a-z]$/", $param)) { 
    // throw an Exception... 
} 

Se si desidera consentire lettere maiuscole troppo, modificare l'espressione regolare di conseguenza:

if (!preg_match("/^[a-zA-Z]$/", $param)) { 
    // throw an Exception... 
} 

altro modo per sostenere case insensitivity è utilizzare il modificatore di insensibilità del caso /i:

if (!preg_match("/^[a-z]$/i", $param)) { 
    // throw an Exception... 
} 
+0

preg_match ("/^[a-z] $/i", $ param) o usare maiuscole e minuscole – Xorlev

+0

I tuoi commenti sono al contrario. Se preg_match riesce ad abbinare [a-z], non dovresti lanciare un'eccezione. if (! preg_match (...)) {eccezione! } –

+0

@Nick Presta: buona presa. Ho aggiunto un '!' Alle condizioni. Grazie :) – Asaph

0

Si può provare:

preg_match('/^[a-zA-Z]$/',$input_char); 

Il valore di ritorno della funzione sopra è vero se il $ INPUT_CHAR contiene un singolo alfabeto, il resto è falso. È possibile utilizzare in modo appropriato il valore di ritorno.

2
preg_match('/^[a-zA-Z]$/', $var_vhar); 

metodo restituirà il valore int: per alcuna corrispondenza restituisce 0 e per le partite restituisce 1.

+1

Regex vanno bene, ma molte volte ne usi uno, anche se banale, reinventando la ruota e introducendo la superficie di contatto per i bug. Preferisco php.net/manual/en/book.ctype.php –

+0

[AZ is passé.] (Http://stackoverflow.com/questions/4955086/sort-upper-case-just-before-lowercase-key -valori-da-un-hash/4958634 # 4958634) – tchrist

18

http://php.net/manual/en/function.ctype-alpha.php

<?php 
    $ch = 'a'; 
    if (ctype_alpha($ch)) { 
     // Accept 
    } else { 
     // Reject 
    } 

Questo prende anche locale in considerazione se si imposta correttamente.

MODIFICA: Per completare, altri poster qui sembrano pensare che sia necessario assicurarsi che il parametro sia un singolo carattere, altrimenti il ​​parametro non è valido. Per verificare la lunghezza di una stringa, è possibile utilizzare strlen(). Se strlen() restituisce un numero diverso da 1, puoi anche rifiutare il parametro.

Così com'è, la tua domanda al momento della risposta, comunica che hai un parametro di un singolo carattere da qualche parte e vuoi controllare che sia alfabetico. Ho fornito una soluzione generica che fa questo, ed è anche local-friendly.

+0

Ma cosa succede se '$ ch' è più lungo di un carattere? – Asaph

+1

Dal manuale: _Controlla se tutti i caratteri nella stringa fornita, testo, sono alfabetici_ctype_alpha() accetta una stringa. –

+0

So cosa 'ctype_alpha()' fa. L'OP vuole rifiutare tutto l'input che è più lungo di un carattere e la tua soluzione non lo fa. – Asaph

0

Vorrei usare il ctype, come suggeriva Nick, poiché non è solo più veloce della regex, è persino più veloce della maggior parte delle funzioni di stringa incorporate in PHP. Ma è anche necessario per assicurarsi che sia un singolo carattere:

if (ctype_alpha($ch) && strlen($ch) == 1) { 
    // Accept 
} else { 
    // Reject 
} 
+0

No, non lo fai. ctype_alpha controlla l'intera stringa. Vedi il manuale. –

+1

So che lo fa. Ma vuole solo che il parametro sia un singolo personaggio. Quindi se la stringa è 'AB' dovrebbe essere respinta, indipendentemente dal fatto che siano entrambi controllati con' ctype_alpha'. Vedi la domanda – Anthony

+0

Forse dovresti vedere la domanda. L'OP afferma che * già * ha un singolo parametro di carattere. Vuole verificare se quel parametro è alfabetico. Controllare la lunghezza del parametro è responsabilità del chiamante, o almeno non dovrebbe essere gestito qui come l'OP non ha mai richiesto questo, e non ha nulla a che fare con la domanda, "Determinare se un personaggio è alfabetico". –

1

Non è possibile usare [a-zA-Z] per Unicode.

qui sono l'esempio di lavoro con Unicode,

if (preg_match('/^\p{L}+$/u', 'my text')) { 
    echo 'match'; 
} else { 
    echo 'not match'; 
} 
0

Questo aiuterà spera.Questa è una semplice funzione in php chiamata

$mystring = 'a' 
if (ctype_alpha($mystring)) 
{ 
    //Then do the code here. 
} 
+1

Solo per riferimento futuro; c'erano già due risposte che fornivano informazioni sull'uso di 'ctype_alpha', ciascuna pubblicata più di 4 anni fa. Queste risposte includevano anche ulteriori spiegazioni e integravano il campione in ciò che stava facendo il codice dell'OP. In generale, dovresti solo aggiungere una risposta a una domanda molto vecchia come questa se hai qualcosa di sostanziale da aggiungere. –

Problemi correlati