2011-11-13 49 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, 'ÄäÖöÜüß'); 

所有其他语言 - 只为与你替换特殊字符(法语,波兰语等)