2011-11-13 50 views
9

str_word_count()函數返回一個數組,該數組包含字符串中的所有單詞。除非使用特殊字符,否則它效果很好。在這種情況下,PHP腳本通過查詢字符串接收字符串:使用str_word_count()支持特殊字符

當我打開: http://localhost/index.php?q=this%20wórds

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

,而不是返回的:

[0] this 
[1] wórds 

...返回:

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

該功能如何支持這些特殊字符t帽子是通過querystring發送的?

更新 - 它的工作就好用mario的解決方案:

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

回答

10

不確定該第三個參數是否足以使str_word_count適用於非ASCII符號。如果有的話,它可能只適用於Latin-1

作爲替代,你可以使用。然而正則表達式算的話:

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

本工程爲UTF-8,至少。要完全複製str_word_count,最終可能需要[\pL']+

+0

它也很棒。第一個和第二個正則表達式有什麼區別?無法讓第二個人工作。 – andufo

+2

第二個將允許像'不'這樣的東西被算作單個詞。完整的正則表達式當然是''/ [\ pL'] +/u''。手冊http://de.php.net/manual/en/function.str-word-count.php#85592中有另一個版本,可能涵蓋所有其他應該被視爲單詞的印刷版本。 – mario

+1

「/ \ p {L} [\ p {L} \ p {Mn} \ p {Pd}'\ x {2019} */u」---謝謝! – andufo

1

什麼只是

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

您也可以爆炸的('」,$字符串)字符串和計數($ array);

+0

是行不通的。如果你沒有設置允許的charlist,那麼我試圖包含的那個ó將不會作爲單詞的一部分返回。 explode()解決方案聽起來不錯,但不涵蓋所有情況。例如:words.separated by.dots – andufo

+0

如果您需要點作爲分隔符,您可以使用$ result = preg_split('/ [。] /',$ subject);這將使用空格或點作爲分隔符。 – Homer6

+0

問題是我不能依賴用戶輸入。如果他們想要,他們可能會添加這樣的字符串: – andufo

0

德語語言使用這樣的:

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

所有其他語言 - 只爲與你替換特殊字符(法語,波蘭語等)