note 85579 deleted from function.str-word-count by sobak
| From: | sobak@php.net | Date: | Sat, 10 Dec 2016 11:14:05 +0000 |
| Subject: | note 85579 deleted from function.str-word-count by sobak | ||
| References: | 1 | Groups: | php.notes |
| Request: | Send a blank email to php-notes+get-208424@lists.php.net to get a copy of this message | ||
Note Submitter: om+www dot php dot net at miakinen dot net
----
Here is a code for a function str_word_count() compatible with UTF-8. I'm sorry that the
comments are in French because I am not very good in English: anyway, these comments only try to
explain things that are in PCRE or Unicode documentations.
<?php
/*
* Explications du masque pour preg_match_all.
*
* La fonction str_word_count standard considère qu'un mot est
* une séquence de caractères qui contient tous les caractères
* alphabétiques, et qui peut contenir, mais pas commencer
* par "'" et "-".
*
* Avec Unicode et UTF-8, une lettre peut être un caractères
* ASCII non accentué tel que "e" ou "E", mais aussi un "é"
ou
* un "Ã", lequel peut se représenter sous la forme de deux
* caractères : d'abord le "E" non accentué, puis l'accent tout
* seul. Une lettre "E" ou "Ã" fait partie de la classe « L »,
* un accent de la classe « Mn ».
*
* Par ailleurs, "-" n'est plus le seul trait d'union possible.
* Plutôt que de les lister individuellement, j'ai choisi de
* tester les caractères de la classe « Pd ». Un inconvénient
* est que cela inclut aussi le tiret cadratin et d'autres,
* mais cet inconvénient existait déjà avec str_word_count et
* le tiret ascii, et en outre il ne concerne pas le français
* (contrairement à l'anglais, il y a toujours des espaces
* autour de ces tirets).
*
* Enfin, "'" n'est pas non plus la seule apostrophe possible.
* Mais contrairement aux tirets je teste juste l'apostrophe
* typographique U+2019 à part au lieu de tester la classe « Pf »
* car cette dernière contient trop de signes de ponctuation
* à exclure de la définition d'un mot.
*
* Un mot commence donc par une lettre \\p{L}, éventuellement
* accentuée (suivie par un nombre quelconque de \\p{Mn}), et
* ensuite on peut rencontrer un nombre quelconques d'autres
* lettres (\\p{L} et \\p{Mn}), de tirets (\\p{Pd}) ou d'apostrophes
* (' et \\x{2019}). Tout ceci, bien sûr, dans un masque compatible
* avec UTF-8 (/u à la fin).
*
* Pour les références, voir :
* http://fr2.php.net/manual/fr/regexp.reference.php
#regexp.reference.unicode
* http://fr2.php.net/manual/fr/reference.pcre.pattern.modifiers.php
*/
define("WORD_COUNT_MASK",
"/\\p{L}[\\p{L}\\p{Mn}\\p{Pd}'\\x{2019}]*/u");
function str_word_count_utf8($str)
{
return preg_match_all(WORD_COUNT_MASK, $str, $matches);
}
?>