2011-11-13 24 views
9

Funkcja str_word_count() zwraca tablicę zawierającą wszystkie słowa w łańcuchu. Działa świetnie, z wyjątkiem sytuacji, gdy używasz znaków specjalnych. W takim przypadku, skrypt php odbiera ciąg poprzez kwerendy:Obsługa znaków specjalnych za pomocą str_word_count()

podczas otwierania: http://localhost/index.php?q=this%20wórds

header('Content-Type: text/html; charset=utf-8'); 
print_r(str_word_count($_GET['q'],1,'ó')); 

Zamiast powrotu:

[0] this 
[1] wórds 

... powraca:

[0] this 
[1] w 
[2] rds 

W jaki sposób ta funkcja może obsługiwać znaki specjalne t kapelusz jest wysyłany przez zapytanie?

Aktualizacja - wyszło dobrze używając mario 's rozwiązanie:

function sanitize_words($string) { 
    preg_match_all("/\p{L}[\p{L}\p{Mn}\p{Pd}'\x{2019}]*/u",$string,$matches,PREG_PATTERN_ORDER); 
    return $matches[0]; 
} 

Odpowiedz

10

Nie jestem pewien, czy ten trzeci parametr jest wystarczający do tego, aby str_word_count pracował dla symboli innych niż ASCII. Prawdopodobnie działa tylko z Latin-1, jeśli cokolwiek.

Jako alternatywę można policzyć słowa z regex Jednakże:

$count = preg_match_all('/\pL+/u', $_GET['q'], $matches); 

Działa to na UTF-8, co najmniej. Aby w pełni zreplikować str_word_count, możesz ostatecznie potrzebować [\pL']+.

+0

To też zadziałało. Jaka byłaby różnica między pierwszym i drugim wyrażeniem regularnym? Nie mogę zmusić drugiej do pracy. – andufo

+2

Drugie pozwoliłoby, aby rzeczy takie jak "nie" były liczone jako pojedyncze słowo. Pełne wyrażenie regularne to oczywiście '/ [\ pL '] +/u''. Istnieje inna wersja w podręczniku http://de.php.net/manual/en/function.str-word-count.php#85592, która prawdopodobnie obejmuje wszystkie inne warianty typograficzne tego, co powinno być uważane za słowo. – mario

+1

"/ \ p {L} [\ p {L} \ p {Mn} \ p {Pd} '\ x {2019}] */u" - dziękuję! – andufo

1

Co o zaledwie

print_r(str_word_count($_GET['q'],1)); ? 

Można również eksplodować ('”, $ string) na łańcuch i liczba ($ tablica);

+0

nie będzie działać. jeśli nie ustawisz dozwolonej listy charytatywnej, ta, którą próbuję uwzględnić, nie zostanie zwrócona jako część słowa. Rozwiązanie explode() brzmi nieźle, ale nie obejmuje wszystkich przypadków. Na przykład: words.separated by.dots – andufo

+0

Jeśli potrzebujesz kropek jako separatora, możesz użyć $ result = preg_split ('/ [.] /', $ Subject); To będzie używać spacji lub kropek jako ogranicznika. – Homer6

+0

Problem polega na tym, że nie mogę polegać na danych wprowadzanych przez użytkownika. jeśli chcą, mogą dodać takie ciągi: – andufo

0

do zastosowania języka niemieckiego to:

str_word_count($file, 1, 'ÄäÖöÜüß'); 

dla wszystkich innych językach - po prostu zastąpić znaki specjalne z Ciebie (francuski, polski itd ...)

Powiązane problemy