26/03/2006 11:54 par Sebastien |
10 réponse(s) |
Signaler un contenu abusif ou erroné
Bonjour à tous,
Je cherche à corriger automatiquement la typographie d'un texte, saisi
par l'utilisateur dans un textarea HTML.
Cette correction est facultative, une case à cocher permet de l'activer
ou non et de plus il y a une prévisualisation avant soumission
définitive. Voici pour le décor.
-> essais de regexp en fin de post.
Objectifs :
Il s'agit de corrections pour les erreurs les plus fréquentes, comme
l'oubli de l'espace (insécable) avant les ponctuations doubles : ; ! ?
et à l'intérieur des guillemets français « et ».
Si l'espace est absent on ajoute un espace insécable, si un espace
normal est présent on le transforme en espace insécable.
Raffinement ultime (et complications à l'horizon), auquel je tiens
beaucoup, l'apostrophe droite est transformée en apostrophe «
typographiquement correcte » (').
Complication supplémentaire (voir point précédent), le texte peut
contenir du pseudo-code Wiki, avec en particulier '' (deux apostrophes
droites) entourant du texte devant être rendu en italique.
Pour finir, le tout est à destination d'une base de données MySQL, mais
cela n'a aucune incidence (si je ne m'abuse) car la chaîne sera insérée
avec mysql_real_escape_string(). On considère que la chaîne (reçue en
POST) est passée par stripslashes() si nécessaire avant tout traitement.
Les expressions :
<?php
function cleanup_typo($str)
{
$patterns[0] = '/([^\'].)\'([^\'].|0)/'; // Apostrophe droite non
précédée d'une autre apostrophe
$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] = '/\.{3}/'; // Trois-points
$replacements[0] = '$1'$2';
$replacements[1] = '$1 :';
$replacements[2] = '$1 ;';
$replacements[3] = '« $1';
$replacements[4] = '$1 »';
$replacements[5] = '$1 !';
$replacements[6] = '$1 ?';
$replacements[7] = '--';
$str = preg_replace($patterns, $replacements, $str);
/* Ces 2 lignes sont issues de wiki2html : conversion en espaces
insécable des espaces existants */
$str = preg_replace('/[ ]+([:?!;»])/',' $1',$str);
$str = preg_replace('/(«)[ ]+/','$1 ',$str);
return $str;
}
?>
Si vous avez lu jusqu'ici sans tricher, bravo et merci.
Je suis intéressé par vos observations à tous les niveaux :
- problèmes liés aux risques de remplacer du texte qui ne devrait pas l'être
- erreurs dans les regexp (pourtant testée, mais peut-être pas sur tous
les cas)
- Possibilités d'optimisation
- Mauvaise interprêtation des règles de typographie française
-
Ceci n'est qu'un premier jet, je ne suis toujours pas un expert en
expressions régulières. Je n'ai fait que quelques tests e tje sens que
mes expressions sont pleines de trous
Sébastien
10 réponse(s) |
|
Transférer |
Imprimer
Tout le forum
-
Borderlands : patch 1.2.1
GearboxSoftware vient de mettre une nouvelle mise à jour en ligne pour son titre Borderlands.
-
The Unarchiver
The Unarchiver est un logiciel de décompression de données pour l'environnement Mac OS.
-
Gadget MEDIADICO
Un gadget - widget - qui permet d'utiliser plusieurs dictionnaires en ligne pour trouver une définition, une traduction ou un synonyme.
Tous les téléchargements