2011-12-13 10 views
8

Desidero contare (all'interno di una singola espressione regolare) tutti gli spazi all'inizio di una stringa.Conteggio degli spazi iniziali

Le mie idee:

$identSize = preg_match_all("/^()[^ ]/", $line, $matches); 

Per esempio:

$example1 = " Foo"; // should return 1 
$example2 = " Bar"; // should return 2 
$example3 = " Foo bar"; // should return 3, not 4! 

Eventuali suggerimenti, come posso risolverlo?

risposta

14
$identSize = strlen($line)-strlen(ltrim($line)); 

Oppure, se si vuole espressione regolare,

preg_match('/^(\s+)/',$line,$matches); 
$identSize = strlen($matches[1]); 
+1

Primo uno è intelligente. Posso immaginare che sia più veloce della versione preg_match. – Powertieke

+0

+1, ma la tua prima versione prende in considerazione solo gli spazi, potresti anche includere altri caratteri di spazi vuoti. – codaddict

+0

@codaddict Sebbene la domanda degli OP consistesse nel conteggiare degli spazi, quindi se ci sono osservazioni da fare riguardo all'espressione regolare specificata. –

1

Si potrebbe fare un preg_match per spazi consecutivi (in modo che abbinato restituisce stringa " ") all'inizio della stringa.

Quindi è possibile utilizzare strlen sulla partita per restituire il numero di caratteri whitepace.

9

Invece di utilizzare un'espressione regolare (o qualsiasi altra modifica), è necessario utilizzare strspn, che è definito per gestire questo tipo di problemi.

$a = array (" Foo", " Bar", " Foo Bar"); 

foreach ($a as $s1) 
    echo strspn ($s1, ' ') . " <- '$s1'\n"; 

uscita

1 <- ' Foo' 
2 <- ' Bar' 
3 <- ' Foo Bar' 

Se OP vuole contare di più che spazi (es. Gli altri caratteri bianchi) il 2 ° argomento di strspn dovrebbe essere " \t\r\n\0\x0B" (tratto da quello che trim definisce come caratteri bianchi).

Documentazione PHP: strspn - Manual

Problemi correlati