Verificateur de regles de ponctuation.

  • Auteur de la discussion Auteur de la discussion k2pi
  • Date de début Date de début
WRInaute occasionnel
Bonjour a tous,

Comme beaucoup de webmaster, je passe pas mal de temps a relire ce que les internautes écrivent sur mes sites. Pour les fautes d'orthographes mon petit plugin firefox fait ça très bien et en général ça va assez vite. Par contre je passe un temps fou a rectifier les fautes de ponctuation. Entre ceux qui mettent des espaces partout, ceux qui n'en mettent jamais... ajouter a ça les gens qui n'ont pas compris la différence entre majuscule et minuscule... bref il y a dix minutes n'y tenant plus je lance mon éditeur préféré, me dis que yen a marre jvais coder un truc qui rectifie ça tout seul et pis c'est tout !

Mais la je viens de relever la tête de mon clavier et une interrogation me parcours... et si ça existait déjà.. ? (ce qui ma fois est quand même grandement probable...)

Donc si vous connaissez un truc qui fait ça, vous pouvez me faire gagner quelques heures de code :)

Bon sinon, promis une fois que j'ai fini je fait tourner ;)
 
WRInaute discret
Moi aussi je serais intéressé par ce genre de fonction... Jusqu'à présent je me limite à remplacer les espaces normaux par des espaces insécables devant les ponctuations double et à changer les « ' » en « ’ », donc un script un peu plus développé me serait très utile !
 
WRInaute occasionnel
Très bonne idée, mais je pense que c'est assez dure à développer.

Sinon, il y a la société Druide, développeur du logiciel Antidote qui est excellent, qui propose un service de correction des pages : http://www.webelixir.net/

à plus
 
WRInaute occasionnel
C'est pas si dur que ca. A la limite ce qui peut être marrant c'est de faire un truc avec des règles externalisées pour pouvoir choisir son mode de correction (par exemple pour le : c'est un espace avant et apres en francais et juste un apres en anglais...)
 
WRInaute accro
Pas compliqué de faire ca...

Le principe algorithmique que je propose est simple, on lit la chaine caractere par caractere et on la recontruit on fonction du dernier caractere trouvé, ca marche plutot bien.

le snipet contient:
- gestion des virgules
- gestion des points
- gestion des doubles points

qui veux aider a le perfectionner ??

++

Code:
<?php
 
  
  $texte = "texte a modifier";

  $i = 0;
  while (  $i < strlen( $texte ) ) {

     $caractere_a_analyser = $texte[$i];

     if ( $lance_majuscule_au_prochain_tour == TRUE ) {
     $caractere_a_analyser = ucfirst( $caractere_a_analyser );
     $resultat .= $caractere_a_analyser;
     $lance_majuscule_au_prochain_tour = FALSE;
     }

     elseif ( $caractere_a_analyser == '.' AND $texte[$i+1] != ' ') {
     $resultat .= '. ';
     $lance_majuscule_au_prochain_tour = TRUE;
     }

     elseif ( $caractere_a_analyser == ':' AND $texte[$i+1] != ' ') {
     $resultat .= ': ';
     $lance_majuscule_au_prochain_tour = TRUE;
     }

     elseif ( $caractere_a_analyser == ',' ) {
     $resultat .= ', ';
     }


     else  $resultat .= $caractere_a_analyser;


     $i++;
     }


     echo $texte;
     echo '<br />';
     echo $resultat;

?>
 
WRInaute accro
il y a un problème pour les points, car "..." deviendrait ". . . "
sans compter les uri saisis directement dans le texte où on aurait tout de séparé :cry:
 
WRInaute occasionnel
k2pi a dit:
Donc si vous connaissez un truc qui fait ça, vous pouvez me faire gagner quelques heures de code :)

J'ai aussi cherché et j'ai rien trouvé de tout fait, je suis en train de le faire perso en récupérant des bouts de scripts par ci par là.
Je pense que les besoins peuvent être très différents pour chacun. Mon cahier des charges :
- Suppression des espaces et retours chariots inutiles,
- Signes de ponctuation avec les bons espaces avant et après (pas d'url dans le texte...),
- Majuscule en début de phrase et point à la fin mais pas possible de tout passer en minuscules au milieu car il peut y avoir des noms propres,
- Les mots entièrement en majuscules (noms propres) sont mis en 1 majuscule + minuscules (c'est pas un forum donc pas de mecs qui crient :wink:)

Au début j'ai essayé de le faire avec des expressions régulières mais pour les majuscules j'ai pas trouvé, vous pensez que c'est possible ?
Par contre pour la ponctuation j'ai trouvé ça.

Edit pour faute de ponctuation ...
 
WRInaute accro
Leonick a dit:
il y a un problème pour les points, car "..." deviendrait ". . . "
sans compter les uri saisis directement dans le texte où on aurait tout de séparé :cry:

Pour les ... il suffit de regarder le prochain caractere et le tour est joué
elseif ( $caractere_a_analyser == '.' AND $texte[$i+1] != '.'}

pour les url je propose un preg_replace() pour ajouter un marqueur en debut et fin des urls presentent dans le texte (#http://www.ndd.ext#) et au moment de recontruire la chaine on passe dessus.
$texte = preg_replace('#(http|https|ftp)://([[:alnum:]/\n+-=%&:_.~?]+[#[:alnum:]+]*)#','\#\\1://\\2\#',$texte);

le lien d'Acerouk est interressant, fully regex mais je ne vois pas comment on peut gerer les majuscules ( bien qu'avec une fonction callback..) mais c'est surtout les points (.) qui vont etre ingerable. Justement a cause des urls

A mon avis, il faut utiliser les preg pour marquer les exeptions qui sont nombreuses dans un texte:
- urls
- smileys
- mot complement en majuscule
- oublie des masjuscules (St, Mr, Miss...)

et reconstruire tranquille la chaine en gérant les differents marqueurs
 
WRInaute accro
le problème des url, c'est que souvent dans les fora elles sont inscrites sans le http et quand elles ne contiennent pas de www. dedans, ce n'est pas évident de construire une regex pour les trouver
 
WRInaute accro
tout depend du masque, celui capture tout les differents formats d'urls

Code:
$masque  = '#';
$masque .= '([http|ftp|https]+://';
$masque .= '[www\.]?';
$masque .= '[\.\-a-zA-Z0-9]*';
$masque .= '[a-zA-Z]{2,4}?';
$masque .= '[\?/\=\&\-_.a-zA-Z0-9]+?';
$masque .= '[\?/\=\&\-_.a-zA-Z0-9]+)';
$masque .= '#i';
 
WRInaute accro
non, parce qu'un internaute quand il va donner un lien, il ne va pas taper http:// s'il est présent, c'est qu'il aura été sur ce lien et aura copié l'url dans la barre d'adresse pour le coller dans la page, mais quand le lien est mis de tête, il n'y a pas le protocole de mis
 
WRInaute accro
bien vu :)

$masque = '\([http|ftp|https]://[www\.]+)?([\.\-a-zA-Z0-9]*[a-zA-Z]{2,4}?[\?/\=\&\-_.a-zA-Z0-9]+?[\?/\=\&\-_.a-zA-Z0-9]+?)?\';

le principe reste simple, prendre le texte et y coller des marqueurs puis relire le texte en sortant tout les indices du tableau a ne pas analyser.

au final on aura une liste d'indices du texte -> $texte[$i]
genre $indice = array('4','5','6','15','16','18','19','20');

suffit de reconstruire le texte en ne tenant pas compte de ces cases.
 
WRInaute occasionnel
Voici mon code, sans prise en compte des smileys et des url et avec encore quelques bugs à corriger :

Code:
function TypoPhrase($texte, $retourligne)
{
	if ($retourligne == 0)
	{
		$texte = str_replace(array("\n","\r\n","\r"), array(" "," "," "), $texte); // supprime les retour à la ligne
	}
	else
	{
		$texte = nl2br($texte);	// retour à la ligne html
	}
	$texte = stripslashes($texte); // supprime les antislash
	$texte = preg_replace('/\s{2,}/', ' ', $texte); // réduit les espaces >= 2
	$texte = str_replace('"','',$texte);
	// Mettre une majuscule après . ! et ?
	for($i = 0; $i < strlen($texte); $i++)
	{
		$lettre = substr($texte, $i, 1);
		if($lettre == '.' || $lettre == '!' || $lettre == '?')
		{
			$capital = true;
		}
		elseif(!empty($lettre) && $capital == true)
		{	
			$lettre = strtoupper($lettre); // Met une majuscule
			$capital = false;
		}
		$new_texte .= $lettre;
	}
	$texte = $new_texte;

	$texte = str_replace(' ,', ',', $texte); // suppression espace devant , et .
	$texte = str_replace(' .', '.', $texte);
	
	$patterns[0] = '/:([^ ])/'; 	// Deux-points non suivi d'un espace
	$patterns[1] = '/([^ ]):/'; 	// Deux-points non précédé d'un espace
	$patterns[2] = '/([^ ]);/'; 	// Point-virgule non précédé d'un espace
	$patterns[3] = '/«([^ ])/'; 	// Guillemet ouvrant non suivi d'un espace
	$patterns[4] = '/([^ ])»/'; 	// Guillemet fermant non précédé d'un espace
	$patterns[5] = '/([^ ])!/'; 	// Point d'exclamation non précédé d'un espace
	$patterns[6] = '/([^ ])\?/'; 	// Point d'interrogation non précédé d'un espace
	$patterns[7] = '/,([^ ])/'; 	// Virgule non suivi d'un espace
	$patterns[8] = '/\.([^ ])/';	// Point non suivi d'un espace
	$replacements[0] = ': $1';
	$replacements[1] = '$1 :';
	$replacements[2] = '$1 ;';
	$replacements[3] = '« $1';
	$replacements[4] = '$1 »';
	$replacements[5] = '$1 !';
	$replacements[6] = '$1 ?';
	$replacements[7] = ', $1';
	$replacements[8] = '. $1';
	$texte = preg_replace($patterns, $replacements, $texte);	
	$texte = trim($texte); // supprime les espaces et autre au début et à la fin de la chaine
	$texte = ucfirst($texte);
	if (substr($texte, -1, 1) != '.') // ajoute le point à la fin
	{
		$texte = $texte.'.';
	}
	
	return $texte;
}
 
Discussions similaires
Haut