2010-12-27 14 views
21

ho una stringa di dire: Order_num = "0982asdlkj"PHP stringa divisa in elemento intero e la stringa

Come posso dividere che nelle 2 variabili, con l'elemento numero e poi un'altra variabile con l'elemento lettera in php?

L'elemento numero può essere qualsiasi lunghezza da 1 a 4 dire e l'elemento lettera riempie il resto per rendere ogni numero dell'ordine di 10 caratteri in totale.

Ho trovato la funzione php explode ... ma non so come farlo nel mio caso perché il numero di numeri è compreso tra 1 e 4 e le lettere sono casuali, quindi non c'è modo di dividere in una lettera particolare. Si prega di aiutare nel modo più specifico possibile!

risposta

29

È possibile utilizzare preg_split utilizzando lookahead and lookbehind:

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

stampe

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

Questo funziona solo se la parte della lettera contiene solo lettere e senza cifre.

Aggiornamento:

Giusto per chiarire che cosa sta succedendo qui:

Le espressioni regolari guarda ogni posizione e se una cifra è prima di quella posizione ((?<=\d)) e una lettera dopo ((?=[a-z])), quindi corrisponde e la stringa viene divisa in questa posizione. Il tutto è senza distinzione tra maiuscole e minuscole (i).

+1

Ecco come si usano le asserzioni di ricerca con 'preg_split()'! +1 – BoltClock

+2

Qual è il vantaggio dell'utilizzo della partita split over? – marcog

+1

È necessario uscire dal \ in \ d. – marcog

6

Utilizzare preg_match() con un'espressione regolare di (\d+)([a-zA-Z]+). Se si desidera limitare il numero di cifre a 1-4 e lettere a 6-9, modificarlo in (\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"); 

Uscite:

Integer component: 0982 
Letter component: asdlkj 

http://ideone.com/SKtKs

+1

'$ matches = array();' non è realmente necessario. 'preg_match' assicurerà che la matrice esista sempre, anche quando non c'è corrispondenza. – codaddict

+1

Inoltre non è necessario l'escape \ in \\ d +. \ d + è sufficiente. – codaddict

+1

@codaddict: Ma è buono stile di codifica e più facile da capire per il programmatore PHP meno esperto IMO. –

2

È possibile utilizzare un'espressione regolare per quello.

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

Non userò il limite rigoroso sul numero ma oltre a ciò è la risposta più sensata. –

5

È anche possibile farlo utilizzando preg_split suddividendo il vostro contributo al punto che tra le cifre e le lettere:

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

See it

0

check this out

<?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]; 
?> 

per quanto riguarda

wazzy

+0

Aggiorna il tuo PHP dalla versione precedente a qualcosa di moderno ed eseguilo di nuovo –

+0

@Wazzy: Perché le persone sono pazze e le risposte negative rispetto a * non piacciono *. Per essere onesti, la tua soluzione non è molto elegante, ma dà la soluzione giusta. Non lo svuoterei, ma non lo farei neanche a valle. +1 dal mio per compensare. –

+0

@Col. Shrapnel: funziona bene con PHP 5.3.3 –