2011-12-13 21 views
8

Chcę policzyć (w ramach jednego wyrażeń regularnych) wszystkie spacje na początku ciągu.Zliczanie początkowych białych znaków

Moje pomysły:

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

Na przykład:

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

Wszelkie wskazówki, w jaki sposób można go rozwiązać?

Odpowiedz

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

Albo, jeśli chcesz wyrażenie regularne,

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

Pierwsza jest inteligentna. Mogę sobie wyobrazić, że jest szybszy niż wersja preg_match. – Powertieke

+0

+1, ale twoja pierwsza wersja uwzględnia tylko spacje, możesz również dołączyć inne białe znaki. – codaddict

+0

@codaddict Chociaż pytanie OPs było policzenie spacji, w związku z tym, jeśli są jakieś uwagi, które należy poczynić, dotyczą one określonego wyrażenia regularnego. –

1

Można zrobić preg_match dla kolejnych białych znaków (tak, aby pasował powraca string "„) na początku łańcucha.

Następnie można użyć strlen w meczu, aby zwrócić liczbę znaków whitepace.

9

Zamiast używać wyrażenia regularnego (lub jakiegokolwiek innego hacka), należy użyć strspn, który jest zdefiniowany do obsługi tego rodzaju problemów.

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

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

wyjście

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

Jeśli PO chce liczyć więcej niż tylko przestrzeni (tj. Innych białych znaków) 2nd argumentu strspn powinny być " \t\r\n\0\x0B" (zaczerpnięte z co trim definiuje jako białych znaków).

Dokumentacja PHP: strspn - Manual

Powiązane problemy