2013-05-30 22 views
5

Jeśli umieściłem * w moim wyrażeniu, to nie działa, jeśli wstawię +, to działa.PHP Regex (inny wynik między + i *)

* powinno oznaczać 0 lub więcej, + powinno oznaczać 1 lub więcej.


Case z *

$num = ' 527545855 '; 
var_dump(preg_match('/\d*/', substr($num, 0, 18), $coincidencias)); 
var_dump($coincidencias);exit; 

Wynik:

int(1) 
array(1) { 
    [0]=> 
    string(0) "" 
} 

Case z +

$num = ' 527545855 '; 
var_dump(preg_match('/\d+/', substr($num, 0, 18), $coincidencias)); 
var_dump($coincidencias);exit; 

Wynik:

int(1) 
array(1) { 
    [0]=> 
    string(9) "527545855" 
} 

Myślałem, że oba powinny działać, ale nie rozumiem, dlaczego * nie działa.

+0

Dobre pytania: D –

+0

Dlaczego 'substr'? Możesz po prostu przekazać '$ num'. – nhahtdh

+4

Spróbuj i zobacz, co się stanie, gdy użyjesz 'preg_match_all()' zamiast ... –

Odpowiedz

3

Byłoby dopasować cyfr lub nic

\d* oznacza mecz do wielu cyfr


Dla przykładu w

hello 123

regex \d*

pasowałby 8 razy tj 1 przy starcie (^), 6 razy na hello i 1 raz na 123

+0

Dzięki, przykład uczynił go jaśniejszym. – JorgeeFG

7

* oznacza 0 lub więcej wystąpień zatem pierwszym występowanie jest nieważne ciąg w ciąg testu

+1

Dzięki HamZa !!! –

4

Wola silnik próby dopasowania począwszy od indeksu 0.

  • Od \d* można dopasować ciąg pusty , silnik zwróci pusty ciąg znaków o indeksie 0.
  • W przeciwieństwie do tego, \d+ musi się zgadzać z co najmniej jedną cyfrą, a ponieważ kwantyfikator jest chciwy, zwróci najbliższą sekwencję cyfr, jednocześnie pobierając tyle cyfr, ile to możliwe (w twoim przypadku jest to cała sekwencja cyfr w ciągu wejściowym).
4

Odpowiedziałeś to w swoim pytaniu:

* should mean 0 or more, + should mean 1 or more.

Pierwszą rzeczą, która jest dopasowana była lub więcej cyfr.

2

* w regex wykonuje znak przed nim i patrzy na 0 lub więcej wystąpień. W przypadku wyrażeń regularnych w przypadku pojedynczego wyszukiwania zostanie wyświetlona 1 lub więcej instancji.

Ponieważ tak naprawdę nie sprawdzasz numeru (troszcząc się o inne rzeczy), odzyskasz więcej elementów z regex z *, ponieważ pozwala to na spełnienie klauzuli 0 instancji, która jest ważna dla wszystkich twoich przestrzeni przed liczbą (spacja odpowiada 0 wystąpieniom liczby). Numer + zapewnia co najmniej.