note 85579 modified in function.str-word-count by danbrown

From: Date: Fri, 31 Aug 2012 16:25:43 +0000
Subject: note 85579 modified in function.str-word-count by danbrown
References: 1  Groups: php.notes 
Request: Send a blank email to php-notes+get-190362@lists.php.net to get a copy of this message
Here is a code for a function str_word_count() compatible with UTF-8. I&#39;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.&#13;&#10;&#13;&#10;&#60;?php&#13;&#10; /*&#13;&#10; * Explications du masque pour preg_match_all.&#13;&#10; *&#13;&#10; * La fonction str_word_count standard considère qu&#39;un mot est&#13;&#10; * une séquence de caractères qui contient tous les caractères&#13;&#10; * alphabétiques, et qui peut contenir, mais pas commencer&#13;&#10; * par &#34;&#39;&#34; et &#34;-&#34;.&#13;&#10; *&#13;&#10; * Avec Unicode et UTF-8, une lettre peut être un caractères&#13;&#10; * ASCII non accentué tel que &#34;e&#34; ou &#34;E&#34;, mais aussi un &#34;é&#34; ou&#13;&#10; * un &#34;É&#34;, lequel peut se représenter sous la forme de deux&#13;&#10; * caractères : d&#39;abord le &#34;E&#34; non accentué, puis l&#39;accent tout&#13;&#10; * seul. Une lettre &#34;E&#34; ou &#34;É&#34; fait partie de la classe « L »,&#13;&#10; * un accent de la classe « Mn ».&#13;&#10; *&#13;&#10; * Par ailleurs, &#34;-&#34; n&#39;est plus le seul trait d&#39;union possible.&#13;&#10; * Plutôt que de les lister individuellement, j&#39;ai choisi de&#13;&#10; * tester les caractères de la classe « Pd ». Un inconvénient&#13;&#10; * est que cela inclut aussi le tiret cadratin et d&#39;autres,&#13;&#10; * mais cet inconvénient existait déjà avec str_word_count et&#13;&#10; * le tiret ascii, et en outre il ne concerne pas le français&#13;&#10; * (contrairement à l&#39;anglais, il y a toujours des espaces&#13;&#10; * autour de ces tirets).&#13;&#10; *&#13;&#10; * Enfin, &#34;&#39;&#34; n&#39;est pas non plus la seule apostrophe possible.&#13;&#10; * Mais contrairement aux tirets je teste juste l&#39;apostrophe&#13;&#10; * typographique U+2019 à part au lieu de tester la classe « Pf »&#13;&#10; * car cette dernière contient trop de signes de ponctuation&#13;&#10; * à exclure de la définition d&#39;un mot.&#13;&#10; *&#13;&#10; * Un mot commence donc par une lettre \\p{L}, éventuellement&#13;&#10; * accentuée (suivie par un nombre quelconque de \\p{Mn}), et&#13;&#10; * ensuite on peut rencontrer un nombre quelconques d&#39;autres&#13;&#10; * lettres (\\p{L} et \\p{Mn}), de tirets (\\p{Pd}) ou d&#39;apostrophes&#13;&#10; * (&#39; et \\x{2019}). Tout ceci, bien sûr, dans un masque compatible&#13;&#10; * avec UTF-8 (/u à la fin).&#13;&#10; *&#13;&#10; * Pour les références, voir :&#13;&#10; * http://fr2.php.net/manual/fr/regexp.reference.php #regexp.reference.unicode&#13;&#10; * http://fr2.php.net/manual/fr/reference.pcre.pattern.modifiers.php&#13;&#10; */&#13;&#10; define(&#34;WORD_COUNT_MASK&#34;, &#34;/\\p{L}[\\p{L}\\p{Mn}\\p{Pd}&#39;\\x{2019}]*/u&#34;);&#13;&#10;&#13;&#10; function str_word_count_utf8($str)&#13;&#10; {&#13;&#10; return preg_match_all(WORD_COUNT_MASK, $str, $matches);&#13;&#10; }&#13;&#10;?&#62; --was-- 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); } http://php.net/manual/en/function.str-word-count.php

« previous php.notes (#190362) next »