2010-12-27 10 views
21

Mam ciąg powiedzieć: Order_num = "0982asdlkj"PHP podzielonego ciąg do liczby całkowitej elementu i ciąg

Jak mogę podzielić, że do 2 zmiennych, z elementem numer, a następnie innej zmiennej z elementem list w PHP?

Element liczba może mieć dowolną długość od 1 do 4, a element z literą wypełnia resztę, aby w sumie wpisać 10 znaków.

Znalazłem funkcję php explode ... ale nie wiem, jak to zrobić w moim przypadku, ponieważ liczba cyfr wynosi od 1 do 4, a litery są losowe po tym, więc nie można podzielić na konkretny list. Prosimy o pomoc, tak konkretnie, jak to możliwe!

Odpowiedz

29

Można używać preg_split użyciu lookahead and lookbehind:

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

drukuje

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

Działa to tylko wtedy, gdy litera rzeczywiście zawiera tylko litery i cyfry.

Aktualizacja:

Wystarczy, aby wyjaśnić, co się dzieje tutaj:

Wyrażenia regularne wygląda na każdej pozycji i jeśli cyfrą jest przed tą pozycję ((?<=\d)) i liście po nim ((?=[a-z])), następnie pasuje i ciąg zostaje podzielony w tej pozycji. Całość jest niewrażliwa na wielkość liter (i).

+1

Więc to, w jaki sposób korzystać z 'lookaround twierdzeń preg_split()'! +1 – BoltClock

+2

Jaka jest przewaga korzystania z podziału na mecz? – marcog

+1

Musisz uciec \ in \ d. – marcog

6

Użyj preg_match() z regularnym wyrażeniem (\d+)([a-zA-Z]+). Jeśli chcesz ograniczyć liczbę cyfr do 1-4 i liter do 6-9, zmień ją na (\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"); 

Wyjścia:

Integer component: 0982 
Letter component: asdlkj 

http://ideone.com/SKtKs

+1

'$ matches = array();' tak naprawdę nie jest potrzebne. 'preg_match' zapewni, że tablica będzie zawsze istnieć, nawet jeśli nie będzie pasować. – codaddict

+1

Nie musisz też uciekać w \ \ d +. \ d + wystarczy. – codaddict

+1

@codaddict: Ale jest to dobry styl kodowania i łatwiejszy do zrozumienia dla mniej sprawnego programisty PHP IMO. –

2

Można użyć do tego celu wyrażenia regularnego.

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

Nie użyję ścisłego limitu liczby, ale poza tym jest to najrozsądniejsza odpowiedź. –

5

Można również zrobić to za pomocą preg_split poprzez podział swój wkład w punkcie, który między cyframi i literami:

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

See it

0

to sprawdzić

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

w odniesieniu do

wazzy

+0

Uaktualnij swój PHP ze starożytnej wersji do czegoś nowoczesnego i uruchom go ponownie. –

+0

@Wazzy: Ponieważ ludzie są szaleni, a odpowiedzi w dół * nie lubią *. Aby być uczciwym, twoje rozwiązanie nie jest zbyt eleganckie, ale daje właściwe rozwiązanie. Nie przegłosowałbym tego, ale też nie zgodziłbym się. +1 od mojego, aby to zrekompensować. –

+0

@Col. Shrapnel: działa dobrze z PHP 5.3.3 –

Powiązane problemy