2010-12-13 13 views
5

Necesito un poco de consejo sobre cómo hacer esto. Tengo una matriz PHP de cadenas. Las cuerdas se supone que representan los códigos PIN que son de 6 dígitos como:matriz de filtros PHP

560095 

Tener un espacio después de 3 dígitos también se considera válida como 560 095

Todos los elementos de la matriz no son válidos. Quiero ayuda para hacer este filtrado para obtener una nueva matriz de todos los códigos PIN válidos.

He buscado y parece que debo usar expresiones regulares. ¿Es eso correcto?

Respuesta

17

Sí, puede utilizar la expresión regular para esto.

PHP tiene una función llamada preg_grep a la que se pasa la expresión regular y devuelve una nueva matriz con las entradas de la entrada matriz que coincide con el patrón.

$new_array = preg_grep('/^\d{3} ?\d{3}$/',$array); 

Explicación de la expresión regular:

^  - Start anchor 
\d{3} - 3 digits. Same as [0-9][0-9][0-9] 
? - optional space (there is a space before ?) 
     If you want to allow any number of any whitespace between the groups 
     you can use \s* instead 
\d{3} - 3 digits 
$  - End anchor 
2

Sí, se puede utilizar una expresión regular para asegurarse de que hay 6 dígitos con o sin un espacio.

Una herramienta ordenada por jugar con las expresiones regulares es RegExr ... aquí es lo expresiones regulares que se le ocurrió:

^[0-9]{3}\s?[0-9]{3}$ 

coincide con el comienzo de la cadena ^, luego tres números [0-9]{3} seguido de un opcional espacio \s? seguido de otros tres números [0-9]{3}, seguido del final de la cadena $.

Al pasar la matriz a la función PHP preg_grep junto con la Regex se devolverá una nueva matriz con solo las correspondientes indeces.

0

Si lo que desea es iterar sobre las respuestas válidas (circular sobre ellos), usted podría utilizar siempre una RegexIterator:

$regex = '/^\d{3}\s?\d{3}$/'; 
$it = new RegexIterator(new ArrayIterator($array), $regex); 
foreach ($it as $valid) { 
    //Only matching items will be looped over, non-matching will be skipped 
} 

Tiene la ventaja de no copiar toda la matriz (se calcula el siguiente Cuando quieras). Por lo tanto, es mucho más eficiente con la memoria que hacer algo con preg_grep para arreglos grandes. Pero también será más lento si itera varias veces (pero para una única iteración debería ser más rápido debido al uso de la memoria).

0

Si desea obtener una serie de códigos PIN válidos, use codaddict's answer.

Usted podría también, al mismo tiempo que el filtrado sólo PIN válidos, quite el carácter de espacio opcional para que todos los PIN se convierten en 6 dígitos utilizando preg_filter:

$new_array = preg_filter('/^(\d{3}) ?(\d{3})$/D', '$1$2', $array); 
0

La mejor respuesta podría depender de su situación, pero si quería hacer una verificación simple y de bajo costo primero ...

$item = str_replace(" ", "", $var); 

if (strlen($item) !== 6){ 
echo 'fail early'; 
} 

Después de eso, usted también podría seguir y hacer algunas comprobaciones de tipo - siempre y números válidos no se inició con un 0 en cuyo caso se podría ser más difícil.

Si no falla pronto, continúe con las soluciones de expresiones regulares ya publicadas.