note 85579 deleted from function.str-word-count by sobak

From: 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); } ?>

« previous php.notes (#208424) next »