J'ai fait ceci un peu à la va-vite, vous m'en excuserez. Il s'agit donc vraiment d'une application et non pas d'un script POO.
Vous avez toujours utilisé Microsoft Office Word pour compter les mots de vos textes. Pourtant, dans la langue française, ce logiciel fait défaut et se trompe allègrement entre autre en comptant les mots avec élisions comme un seul mot. ("l'avion" est un mot, et non deux). Confronté à une limite de mots très strict dans un travail, je me suis donc décidé à construire ce petit outil qui, s'il n'est pas parfait, est déjà plus exact que tous les sites Internet et logiciels qui sont offerts.
Ainsi, mon script compte les mots avec apostrophes tout en tenant en considération les exceptions de la langue française (ex : aujourd'hui) afin que vous puissiez avoir accès aux statistiques les plus précises.
Tester ici :
http://tinyurl.com/comptermots (sans les espaces s'il y a lieu)
Le lien direct est le suivant :
http://jdmcreator.byethost5.com/count.html (sans espaces s'il y a lieu)
Source / Exemple :
<!DOCTYPE html>
<html>
<head>
<title>Statistiques - Compteur de mots</title>
<meta charset="iso-8859-1">
<style media="all" type="text/css">
.mode {
margin-top:13px;
}
.mode span {
background:red;
margin-right:4px;
padding:5px;
}
.mode span:first-child {
background:pink;
}
</style>
<script type="text/javascript">
/*
1 mots : d'ores et déjà, no-man's land, queue d'aronde, rubis sur l'ongle, trait d'union
(function(undefined) {
function sortObject(obj) {
var arr = [];
for (var prop in obj) {
if (obj.hasOwnProperty(prop)) {
arr.push({
'key': prop,
'value': obj[prop]
});
}
}
arr.sort(function(a, b) {
return a.value - b.value;
});
return arr;
}
function beautifyNumber(tl) {
var tk = "";
tl = tl.toString();
for (var i = tl.length - 3; i > -4; i = i - 3) {
tk = " " + tl.substring(i, i + 3) + tk;
}
return trim(tk);
}
function trim(m) {
return m.replace(/^\s+/g, '').replace(/\s+$/g, '')
}
var TAB_car = {
" ": "[ESPACE]",
"\n": "[SAUT DE LIGNE]",
"\t": "[TAB]"
}
word = function(a, b) {
var j = a,
reg1 = /[\s'’]+/g,
reg2 = /[\s]+/g,
reg3 = /aujourd['’]{1}hui|n['’]{1}djamena|bernard-l['’]{1}[h]{0,1}ermite|prud['’]{1}hom|s['’]{1}il-(tu|vous)-pla(î|i)t|bec-d['’]{1}(â|a)ne|bouton([s]{0,1})-d['’]{1}(argent|or)|caca d['’]{1}oie|c['’]{1}est-(a|à)-dire|chef([s]{0,1})-d['’]{1}(|oe)uvre|clin d['’]{1}(|oe)il|commedia dell['’]{1}arte|coq-(à|a)-l['’]{1}(â|a)ne|dame-d['’]{1}onze-heures|entr['’]{1}aim|entr['’]{1}aper(c|ç)|entr['’]{1}ouv(r|e)|hors-d['’]{1}(|oe)uvre|je-m['’]{1}en-fichisme|je-m['’]{1}en-f(ichist|outism)e|jusqu['’]{1}au-boutis(t|m)e|m['’]{1}amie|m['’]{1}as-tu-vu|main([s]{0,1})-d['’]{1}(|oe)uvre|monte-en-l['’]{1}air|pas-d['’]{1}(â|a)ne|patte([s]{0,1})-d['’]{1}oie|pet-en-l['’]{1}air|pied([s]{0,1})-d['’]{1}(alouette|oiseau)|pont-l['’]{1}(é|e)v(e|ê)que|qu['’]{1}en-dira-t['’]{1}on|queue-d['’]{1}(aronde|hironde)|sot-l['’]{1}y-laisse|tape-à-l['’]{1}(|oe)il|tout-(à|a)-l['’]{1}(é|e)gout|trompe-l['’]{1}(|oe)il/gi,
reg4 = /[!?:;.,…*/\\\(\){}\[\]+]{1}/g,
reg5 = /\b[A-Z]{3,}(\b|[!?:;.,…*/\\\(\){}\[\]+-]{1})/g,
reg6 = /\b\S*[0-9]+\S*(\b|[!?:;.,…*/\\\(\){}\[\]+-]{1})/g,
reg7 = /[^-'’\s0-9a-zA-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŹźŻżɶɴɢ]+/,
reg8 = /[^a-zA-ZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŹźŻżɶɴɢ]+/g;
b = b || {};
var overtext = "",
mode = b.mode;
if (b.apos) {
a = a.replace(reg4, '').replace(reg3, function(a) {
//console.log(a);
return "AAAAKEY" + a.replace(reg1, 'AGTBAAA');
});
}
a = a.replace(reg7, '');
if (b.MAJ) {
a = a.replace(reg5, ' ')
}
if (b.number) {
a = a.replace(reg6, ' ');
}
var can = j.replace(reg8, '').length;
a = trim(a).split(b.apos ? reg1 : reg2);
var z = [],
mots = [],
motsIIII = [];
classeNombre = {
1: [],
2: [],
3: [],
4: []
}, carac = {};
if (/^\[[0-9]+\:[0-9]+\]$/g.test(b.alpha)) {
var FIRST = parseInt(b.alpha.substring(1, b.alpha.indexOf(':'))),
SECOND = parseInt(b.alpha.substring(b.alpha.indexOf(':') + 1, b.alpha.length - 1)),
TABLE = [];
for (var i = Math.min(FIRST, SECOND); i < Math.max(FIRST, SECOND) + 1; i++) {
TABLE.push(String.fromCharCode(i));
}
b.alpha = TABLE.join("");
}
var alpha = b.alpha || "abcdefghijklmnopqrstuvwxyzæ";
if (mode && b.alpha != "[TOUT]") {
for (var i = 0, l = alpha.length; i < l; i++) {
carac[alpha.charAt(i)] = 0;
}
}
for (var i = 0; i < a.length; i++) {
var t = a[i];
if (t) {
if (t.substring(0, 7) == "AAAAKEY") {
t = t.substring(7).replace(/AGTBAAA/g, '’');
}
t = t.replace(reg7, '')
t = t.toLowerCase();
if (/^[-'’\s]+$/g.test(t)) {
continue;
}
mots[t] = mots[t] || 0;
mots[t]++;
var tl = t.length;
if (tl > 4) {
motsIIII[t] = motsIIII[t] || 0;
motsIIII[t]++;
}
classeNombre[tl] = classeNombre[tl] || [];
classeNombre[tl].push(t);
z.push(t);
if (mode) {}
}
}
if (mode) {
var TOTALC = 0;
for (var i = 0; i < j.length; i++) {
r = j.charAt(i);
if (b.CASE) {
r = r.toLowerCase();
}
if (b.alpha == "[TOUT]") {
if (!isNaN(carac[r])) {
carac[r]++;
} else {
carac[r] = 1;
}
TOTALC++;
} else if (!isNaN(carac[r])) {
carac[r]++;
TOTALC++;
}
}
}
mots = sortObject(mots).reverse();
motsIIII = sortObject(motsIIII).reverse();
moinsdeIII = classeNombre[1].length + classeNombre[2].length + classeNombre[3].length;
moinsdeIIII = moinsdeIII + classeNombre[4].length;
var txt = "Nombre de mots : " + beautifyNumber(z.length) + "\nNombre de caractères : " + beautifyNumber(j.length) + "\nNombre de caractères alphabétiques : " + can + "\n\nMots de moins de trois caractères : " + beautifyNumber(moinsdeIII) + " (" + beautifyNumber(Math.round(moinsdeIII / z.length * 100)) + "%)";
txt += "\nMots de moins de quatre caractères : " + beautifyNumber(moinsdeIIII) + " (" + beautifyNumber(Math.round(moinsdeIIII / z.length * 100)) + "%)\n\n";
if (mots[0]) {
txt += "Mots le plus fréquent : " + mots[0].key + " (" + beautifyNumber(mots[0].value) + " fois)"
}
if (motsIIII[0]) {
txt += "\nMots de plus de quatre caractères le plus fréquent : " + motsIIII[0].key + " (" + beautifyNumber(motsIIII[0].value) + " fois)";
}
if (mode) {
carac = sortObject(carac).reverse();
txt += "\n\nCaractères les plus fréquents :\n-----------";
for (var i = 0, r; i < carac.length; i++) {
r = carac[i];
var kar = (TAB_car[r.key]) ? TAB_car[r.key] : r.key;
txt += "\n" + kar + " (" + beautifyNumber(r.value) + " fois)";
}
txt += "\n-----------\nTotal : " + beautifyNumber(TOTALC) + " caractère" + ((TOTALC > 1) ? "s" : "");
}
document.getElementById('b').innerHTML = txt;
}
})();
function showorhide(w) {
w = w.style;
w.display = (w.display == "none") ? "block" : "none";
}
</script>
</head>
<body>
<h1>Statistiques et compteur de mots V1.0 β</h1>
Vous avez toujours utilisé Microsoft Office Word pour compter les mots de vos textes. Pourtant, dans la langue française, ce logiciel fait défaut et se trompe allégrement entre autre en comptant les mots avec élisions comme un seul mot. ("l'avion" est un mot, et non deux). Confronté à une limite de mots très strict dans un travail, je me suis donc décidé à construire ce petit outil qui,
s'il n'est pas parfait, est déjà plus exact que tous les sites Internet et logiciels qui sont offerts. Par exemple, la phrase exemple ci-dessus compte trois mots de moins sur Word qu'en réalité.<br><br>
<form onsubmit="return false;">
<textarea id="a" style="width:100%;height:150px;">Lorsque j'étais jeune, mon père, tendrement, s'était penché vers moi et m'avait confié le secret le plus doux et le plus profond de ma vie.</textarea>
<div class="mode">
<span>
<input type=radio id="mode" name="mode">Normal</span>
<span>
<input type=radio name=mode checked>Avancé</span>
</div>
<br>Options :
<br>
<input type=checkbox checked id="apos">
<label for="apos">Compter les élisions avec un apostrophe comme plusieurs mots, sauf
<a href="#"
onclick="showorhide(document.getElementById('exceptions'));return false;">exceptions</a>(ex : "l'avion" compte deux mots, "aujourd'hui" compte pour un.)</label>
<br>
<div id="exceptions" style="display:none;">
<br>Exceptions :
<ul>
<li>Aujourd'hui</li>
<li>Bernard-l'ermite</li>
<li>Bec-à-l'âne</li>
<li>Bouton-d'argent</li>
<li>Bouton-d'or</li>
<li>caca d'oie</li>
<li>c'est-à-dire</li>
<li>Chef-d'oeuvre</li>
<li>Clin-d'oeil</li>
<li>Commedia dell'arte</li>
<li>Coq-à-l'âne</li>
<li>Dame-d'onze-heures</li>
<li>Entr'aimer</li>
<li>Entr'apercevoir</li>
<li>Entr'ouvrir</li>
<li>Hors-d'oeuvre</li>
<li>Je-m'en-fichisme</li>
<li>Je-m'en-fichiste</li>
<li>Je-m'en-foutisme</li>
<li>Jusqu'au-boutisme</li>
<li>m'amie</li>
<li>M'as-tu-vu</li>
<li>Monte-en-l'air</li>
<li>Pas-d'âne</li>
<li>Patte-d'oie</li>
<li>Pet-en-l'air</li>
<li>Pied-d'alouette</li>
<li>Pied-d'oiseau</li>
<li>Pont-d'évêque</li>
<li>Main-d'homal</li>
<li>Main-d'homie</li>
<li>N'djamena</li>
<li>Prud'homme</li>
<li>Queue-d'aronde</li>
<li>Queue-d'hironde</li>
<li>S'il-te-plaît</li>
<li>S'il-vous-plaît</li>
<li>Sot-l'y-laisse</li>
<li>Tape-à-l'oeil</li>
<li>Tout-à-l'égout</li>
<li>Trompe-l'oeil</li>
</ul>Ces mots sont comptés comme un seul mot même lorsque l'option ci-dessus
est activée. De même, les formes au pluriel sont acceptés, de même que
l'utilisation du symbole "" à la place de "oe" ainsi que l'oubli des accents.</div>
<input
type=checkbox checked id="maj">
<label for="maj">Compter les mots en majuscules comme des mots</label>
<br>
<input type=checkbox id="number">
<label for="number">Compter les mots contenant des nombres comme des mots</label>
<br>
<br>
<label for="alpha">Caractères à comptabiliser :</label>
<br><input style="width:34ex;" value="abcdefghijklmnopqrstuvwxyzæ" id="alpha"
onkeydown="document.getElementById('selector').value = '1'">
<a href="#" onclick="showorhide(document.getElementById('help'));return false;">(?)</a>
<div id="help" style="display:none"><br>Cet outil avancé vous permet de dresser des statistiques exactes sur l'emploi
de différents caractères. Il suffit d'insérer les caractères recherchés
dans la zone d'entrée de texte ci-haut. De même, le menu déroulant ci-bas
permet de sélectionner certaines listes fréquemment utilisées ou pertinentes.
<br>
<br>Il est aussi possible d'utiliser certaines expressions ou mots-clés, telles
que les suivantes :
<br>
<span>[TOUT]</span>: Comptabilise tous les caractères, incluant les espaces.
<br>
<span>[X:Y]</span>: Comptabilise tous les caractères dont le code Unicode se
situe entre X et Y. Par exemple, [97:122] est l'équivalent de l'alphabet.</div>
<br>
<select id="selector" onchange="if(this.value!=1){document.getElementById('alpha').value = this.value}">
<option value="1">Personnalisé</option>
<option value="[TOUT]">Tous les caractères</option>
<optgroup label="Caractères classiques">
<option value="abcdefghijklmnopqrstuvwxyzæ" selected>Caractères alphabétiques</option>
<option value="0123456789">Caractères numériques</option>
<option value="0123456789abcdefghijklmnopqrstuvwxyzæ">Caractères alphanumériques</option>
</optgroup>
<optgroup label="Caractères accentués">
<option value="Þßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőŕŗřśŝşţťŧũūŭůűųŵŷźżɶɴɢ">Accentués uniquement</option>
<option value="abcdefghijklmnopqrstuvwxyzÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőŕŗřśŝşţťŧũūŭůűųŵŷźżɶɴɢ">Accentués et alphabétiques</option>
<option value="0123456789Þßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőŕŗřśŝşţťŧũūŭůűųŵŷźżɶɴɢ">Accentués et numériques</option>
<option value="0123456789abcdefghijklmnopqrstuvwxyzÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿāăąćĉċčďđēĕėęěĝğġģĥħĩīĭįıijĵķĸĺļľŀłńņňʼnŋōŏőŕŗřśŝşţťŧũūŭůűųŵŷźżɶɴɢ">Accentués et alphanumériques</option>
</optgroup>
<optgroup label="Ponctuation">
<option value="'’#&%*!?:;.,…*/\(){}[]+-¶">Toute la ponctuation</option>
<option value="….!?¶">Séparateurs de phrase</option>
<option value=":;">Relieurs de phrase</option>
<option value="«»-(),">Ponctuation de retrait</option>
<option value="«»()[]{}">Ponctuation double</option>
</optgroup>
<optgroup label="Listes">
<option value="aeiouy">Voyelles</option>
<option value="bcdfghjklmnpqrstvwxz">Consonnes</option>
<option value="02468">Nombres pairs</option>
<option value="13579">Nombres impairs</option>
<option value="abcdefghijklmnopqrstuvwxyzéàèêçë">Caractères les plus fréquents selon Wikipédia</option>
<option value="£¤¥ƒ$₤₵">Monnaie courante</option>
<option value="αβγδεζηθικλμνξοπρστυφχψω">Symboles grecs</option>
<option value="+⊥∦∥∤∣∘∝÷·×±−∑∏∧∨¬∴⊻⊼⊽⋀⋁≃≄≈≉≘≙≝≞≟≠≡≢≤≥≪≫⩽⩾=-">Opérateurs mathématiques</option>
<option value="←↑→↓↔↕↖↗↘↙↚↛↜↝↞↟↠↡↢↣↤↥↦↧↨↩↪↫↬↭↮↯↰↱↲↳↴↵↶↷↸↹↺↻↼↽↾↿⇀⇁⇂⇃⇄⇅⇆⇇⇈⇉⇊⇋⇌⇍⇎⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇚⇛⇜⇝⇞⇟⇠⇡⇢⇣⇤⇥⇦⇧⇨⇩⇪⇫⇬⇭⇮⇯⇰⇱⇲⇳⇴⇵⇶⇷⇹⇺⇻⇼⇽⇾⇿⟰⟱⟲⟳⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽⟾⟿">Flèches</option>
<option value="£¤¥ƒ$₢Д₤₣₧؋৲৳৻૱௹฿៛₠₡₥₦₨₩₪₫₭₮₰₱₲₳₴₵₶₷₸₹꠸﹩$¢£¥रԴPQR">Monnaie</option>
<option value="的一是不了在人有我他这个们中来上大为和国地到以说时要就出会可也你对生能而子那得于着下自之年过发后作里用道行所然家种事成方多经么去法学如都同现当没动面起看定天分还进好小部其些主样理心她本前开但因只从想实">100 caractères mandarins les plus fréquents</option>
</optgroup>
</select>
<input type="checkbox" id="CASE" checked>Insensible à la casse
<br>
<input type="submit" onclick="word(document.getElementById('a').value, {
apos:document.getElementById('apos').checked,
MAJ : !document.getElementById('maj').checked,
number: !document.getElementById('number').checked,
mode : !document.getElementById('mode').checked,
alpha : document.getElementById('alpha').value,
CASE : document.getElementById('CASE').checked
});">
<pre id="b"></pre>
</body>
</html>
Conclusion :
Je tenterai d'ajouter une version en POO et indépendante que vous pourrez ajouter dans vos propres codes. De plus, je tenterai d'optimiser le tout, c'est vraiment un brut de fonderie. Veuillez m'en excuser encore.
Version 1.0 BÊTA
Si vous avez des commentaires, questions, bugs ou si le compte de mots n'est pas bon, merci de me l'indiquer !
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.