2010-12-27 18 views
21

tengo una cadena decir: Order_num = "0982asdlkj"PHP en el elemento número entero y la cadena

Como puedo dividir eso en las 2 variables, con el elemento número y luego otra variable con el elemento de carta en php?

El elemento de número puede tener cualquier longitud de 1 a 4 decir y el elemento de letra llena el resto para hacer que cada order_num tenga 10 caracteres de longitud en total.

He encontrado la función php explode ... pero no sé cómo hacerlo en mi caso porque el número de números está entre 1 y 4 y las letras son aleatorias después de eso, por lo que no hay forma de dividir en una letra particular. ¡Por favor ayuda tan específicamente como sea posible!

Respuesta

29

Le ofrecemos preg_split usando lookahead and lookbehind:

print_r(preg_split('#(?<=\d)(?=[a-z])#i', "0982asdlkj")); 

grabados

Array 
(
    [0] => 0982 
    [1] => asdlkj 
) 

Esto solo funciona si la parte de la carta solo contiene letras y ningún dígito.

Actualización:

Solo para aclarar lo que está pasando aquí:

Las expresiones regulares se ve en todas las posiciones y si un dígito es antes de esa posición ((?<=\d)) y una carta después de que se ((?=[a-z])), luego coincide y la secuencia se divide en esta posición. Todo es insensible a las mayúsculas y minúsculas (i).

+1

¡Así es como se usan las aserciones de lookaround con 'preg_split()'! +1 – BoltClock

+2

¿Cuál es la ventaja de usar split over match? – marcog

+1

Necesita escapar de \ in \ d. – marcog

6

Use preg_match() con una expresión regular de (\d+)([a-zA-Z]+). Si desea limitar el número de dígitos a 1-4 y las letras a 6-9, cámbielo a (\d+{1,4})([a-zA-Z]{6,9}).

preg_match("/(\\d+)([a-zA-Z]+)/", "0982asdlkj", $matches); 
print("Integer component: " . $matches[1] . "\n"); 
print("Letter component: " . $matches[2] . "\n"); 

Salidas:

Integer component: 0982 
Letter component: asdlkj 

http://ideone.com/SKtKs

+1

'$ matches = array();' no es realmente necesario. 'preg_match' se asegurará de que la matriz exista siempre, incluso cuando no coincida. – codaddict

+1

También no necesita escapar \ in \\ d +. \ d + es suficiente. – codaddict

+1

@codaddict: Pero es un buen estilo de codificación y más fácil de entender para el programador de PHP menos experto IMO. –

2

Puede usar un regex para eso.

preg_match('/(\d{1,4})([a-z]+)/i', $str, $matches); 
array_shift($matches); 
list($num, $alpha) = $matches; 
+0

No usaré un límite estricto en el número, pero además de eso, es la respuesta más sensata. –

5

También puede hacerlo utilizando preg_split mediante el fraccionamiento de su entrada en el punto de los cuales entre los dígitos y las letras:

list($num,$alpha) = preg_split('/(?<=\d)(?=[a-z]+)/i',$Order_num); 

See it

0

mira esto

<?php 
$Order_num = "0982asdlkj"; 
$split=split("[0-9]",$Order_num); 
$alpha=$split[(sizeof($split))-1]; 
$number=explode($alpha, $Order_num); 
echo "Alpha -".$alpha."<br>"; 
echo "Number-".$number[0]; 
?> 

con respecto

wazzy

+0

Actualiza tu PHP de la versión antigua a algo moderno y ejecútalo de nuevo –

+0

@Wazzy: porque las personas están locas y responden negativamente * no les gusta *. Para ser justos, su solución no es muy elegante, pero ofrece la solución correcta. No lo votaría mejor, pero tampoco rechazaría. +1 de mi para compensar. –

+0

@Col. Shrapnel: Funciona bien con PHP 5.3.3 –

Cuestiones relacionadas