Gestion des Majuscules [script] - PHP / javascript

WRInaute passionné
Bonjour à tous!

Je suis confronté à un petit problème... Certains de mes utilisateurs, généralement ceux qui proviennent des pays asiatiques comme la Thailande (par exemple) postent leurs annonces en majuscules...

Quand je dis "Majuscules", je veux dire tout le texte en majuscules...

Je pense que ce problème est du à:
- Des utilisateurs peu familiers avec les ordinateurs et les "bonnes pratiques" du web (problème générationnel, métiers/secteurs différents...)
- La langue (je ne sais pas si il y a une différence entre majuscules et minuscules en Thaïlandais ou en Chinois... (Ils ne réalisent peut être pas qu'ils crient sur mon site)

Bref... J'ai pensé à utiliser des fonctions PHP pour remettre en forme certains posts au moment de les enregistrer dans la base (première lettre d'une chaîne en majuscule, première lettre de chaque mot en majuscule...)

Cette solution n'est pas satisfaisante à mon goût car un peu trop "brutale", et cela peut aussi nuire à une certaine mise en forme parfois voulue!

Le top serait d'afficher un message d'erreur en utilisant PHP et/ou Javascript... en fonction du % de majuscules détectées dans la chaîne de caractères... Mais la, je sais pas par ou commencer... Si une bonne âme passe par la avec un début de solution, je suis preneur! :D

Anto
 
WRInaute passionné
Bonjour Anto1982,


Code:
<?php

$var = 'AnTO1982';

$nbcar = strlen($var);

$var = ereg_replace('[^A-Z]','',$var);
$nbmaj = strlen($var);

$taux = ( $nbmaj / $nbcar ) * 100;

echo 'nbcar : '.$nbcar;
echo '<br />';
echo 'nbmaj : '.$nbmaj;
echo '<br />';
echo 'taux : '.$taux.'%';

?>

Codé pour toi à la va-vite... j'espère que tu trouveras ta base de départ la dedans... :wink:
 
WRInaute passionné
Génial!

Réponse rapide, solution efficace... Reco.
Moi qui pensait à des solutions compliquées, j'ai même pas pensé à virer les majuscules pour faire le test... :mrgreen:

Merci!!
 
WRInaute impliqué
Attention, il ne faut plus utiliser les fonctions ereg*. Elles sont obsolètes depuis PHP 5.3.
Il faut préférer preg_replace.

De plus, si ton texte contient des lettres accentuées en majuscule, elles ne seront pas comptées. L'astuce consiste à enlever les accents de la chaîne de caractères avant de compter.

Voici donc une version améliorée :
Code:
<?php
$var = 'AnTO1982É';
setlocale(LC_CTYPE, 'fr_FR.UTF-8');
$var = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $var);

$nbcar = strlen($var);
$var = preg_replace('/[^A-Z]/','',$var);
$nbmaj = strlen($var);

$taux = ( $nbmaj / $nbcar ) * 100;

echo 'nbcar : '.$nbcar;
echo '<br />';
echo 'nbmaj : '.$nbmaj;
echo '<br />';
echo 'taux : '.$taux.'%';
 
WRInaute passionné
[Résolu] Gestion des Majuscules [script] - PHP / javascript

C'est de la balle.

A toutes fins utiles, je rajoute ma brique: un petit script AJAX qui permet d'afficher le message de "warning" sans avoir à soumettre le formulaire, au fur et à mesure que l'utilisateur tape son message!


Fichier: capital_letters_checker.php
Code:
# This file is using AJAX technologies to display an alert message if too much capital letters are typed in a single message

if(isset($_REQUEST['text']) && trim($_REQUEST['text'] != "") && strlen($_REQUEST['text'])>60) {
	
	$var = $_REQUEST['text'];
	setlocale(LC_CTYPE, 'fr_FR.UTF-8');
	$var = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $var);

	$nbcar = strlen($var);
	$var = preg_replace('/[^A-Z]/','',$var);
	$nbmaj = strlen($var);

	$taux = ( $nbmaj / $nbcar ) * 100;

	echo $taux;
	}
(ici le script de Blount et M&B, merci a eux!)

ensuite, le fichier js: capital_letters_checker.js
Code:
function capital_checker(text,max,warning) {
	// alert(text);
	var xhr_object = null;
	if(window.XMLHttpRequest) { // Firefox
		xhr_object = new XMLHttpRequest();
		}
	else if(window.ActiveXObject) { // Internet Explorer
		xhr_object = new ActiveXObject('Microsoft.XMLHTTP');
		}

	var method = 'GET';
	var filename = 'setup/capital_letters_checker.php?text='+text;

	xhr_object.open(method, filename, true);
	xhr_object.onreadystatechange = function() {
		if(xhr_object.readyState == 4) {
			var tmp = xhr_object.responseText;
			if(tmp < max) {
				document.getElementById('text_capital').innerHTML = '';
				}
			else {
				document.getElementById('text_capital').innerHTML = warning;
				}
			

			}
		}
	xhr_object.send(null);
	}
(mettez à jour le chemin du fichier php au besoin)

la page qui initie l'appel:
Code:
<script type="text/javascript" src="setup/capital_letters_checker.js"></script>
<?php
# Ici le début du formulaire

# ici le champs qui va contenir le warning (au dessus du textarea)
$trade_post_form.='<div id="text_capital" style="width:98%;background-color:red;color:white;padding:2px;font-weight:bold;"></div>';

# mon textarea qui contient le texte que je veux vérifier
$trade_post_form.='<textarea onKeyUp="capital_checker(this.value,30,\'Warning Message\');" name="message" rows="10" style="width:98%;"></textarea>';

# La fin de mon formulaire

Vous noterez que la fonction "capital_checker" contient 3 parametres:
- this.value (le texte à vérifier)
- 30 (le % de texte en majuscule toléré... à régler à votre convenance)
- Warning Message => Le message à afficher (peut etre pas la meilleure solution de le faire passer par la... (peut etre qu'un show/hide div aurait été mieux...)
 
WRInaute accro
pourquoi ne pas faire aussi cette vérification en js, au lieu de faire un appel ajax ?
les regex existent aussi en js
 
WRInaute passionné
Leonick a dit:
pourquoi ne pas faire aussi cette vérification en js, au lieu de faire un appel ajax ?
les regex existent aussi en js

J'y ai pensé après coup... et en fait, je maîtrise moins bien javascript...
La c'est vrai que j'arrive quand même avec une solution complexe... mais bon :mrgreen:
 
WRInaute impliqué
De toute manière, JS ou pas, il faudra le faire aussi en PHP. Bien que JS permet d'ajouter une couche évitant un requête HTTP inutile, il n'est clairement pas "sécurisé" dans le sens où tu peux très bien désactiver JS.
 
WRInaute accro
Code:
var filename = 'setup/capital_letters_checker.php?text='+text;
Suis pas certains que ça fonctionne après le premier espace suivant le premier mot.
 
WRInaute passionné
Suis pas certains que ça fonctionne après le premier espace suivant le premier mot.
Si si ça marche... peut être que le truc serait encore plus propre en passant les variable par POST...
il n'est clairement pas "sécurisé" dans le sens où tu peux très bien désactiver JS.
Dans mon cas, je veux juste afficher un message d'alerte... :mrgreen: rien de bien méchant.
 
Discussions similaires
Haut