Produit du jour : Anuman Office One pour Windows XP et Vista à partir de 79.00 € (Logiciel)
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

Include d'un fichier php distant

Image/Graph - Orientation des labels...


10 réponse(s)   |   flux rss   |   Transférer   |   Imprimer
 
 
Téléchargements Tous les téléchargements