Page 1 sur 1

Règles typographiques et expressions régulières

Posté : 07 avr. 2009, 13:41
par Topper
Bonjour à tous,

Certaines personnes aiment bien que les règles typographiques soient respectées. L'un d'elle fait que les ponctuations doubles (?!:;) doivent avoir un espace entre la ponctuation et le caractère qui précède (dans l'idéal insécable). Elles doivent également avoir un espace après (dans l'idéal normal).

J'ai tenté de coder cela avec une expression régulière mais je me heurte à l'exclusion des chaînes qui comportent ces ponctuations et qui ne doivent pas être prises en compte comme les liens.
$chaine="Voici un texte avec des? qui sont parfois ??? avec un esssspace devant ou non; Il y a ausssssi des: ponctuations dans un lien http://www.free.fr?id=1 qu'il ne faut pas modifier. Il y a aussi! des points d'exclamation !";
echo $chaine."<br />";
// Remplace toutes les sequences de plusieurs ponctuations doubles par une seule
$chaine=ereg_replace("[!]{1,}","!", $chaine);
$chaine=ereg_replace("[?]{1,}","?",$chaine);
$chaine=ereg_replace("[:]{1,}",":",$chaine);
$chaine=ereg_replace("[;]{1,}",";",$chaine);
// Place un espace insecable avant les ponctuations doubles
$chaine=preg_replace('`([_a-zA-Z0-9]+)([[:space:]]?)(\?|\!|:|;)`','$1&nbsp;$3',$chaine);
echo $chaine;
Si quelqu'un a une idée pour que la règle exclue les mots commençant par http::// et ftp:// :(

Posté : 12 avr. 2009, 13:07
par Topper
Aucune idée pour exclure une portion de chaine dans une expression régulière alors ? :cry:

Posté : 12 avr. 2009, 18:24
par Hywan
Hey :-),

Ce n'est pas compliqué. Je te conseille d'aller faire un tour sur lumadis.be. Tu y trouveras ta réponse ;-).

Posté : 12 avr. 2009, 20:01
par Topper
J'ai beau faire des tests, il me prend toujours la chaine avec http. :(

Voir test : http://lumadis.be/regex/test_regex.php?id=104

Posté : 13 avr. 2009, 10:08
par Hywan
Pour ma part, j'aurais joué avec les assertions (arrières). Tu as regardé ?

Posté : 13 avr. 2009, 11:51
par Topper
Oui mais je vois pas l'intérêt de savoir ce qu'il y a derrière le point d'interrogation. Cela peut être un mot dont l'espace devant a été oublié et ça ne veut absolument pas dire que c'est une adresse internet.

Posté : 13 avr. 2009, 12:15
par Hywan
Bah réfléchis un peu : tu cherches tous les deux-points (:) qui ne sont pas précédés de http, ftp etc. En fait, comme il existe un nombre infini de protocole, le mieux est d'utiliser une assertion avant, i.e. tu cherches tous les deux-points qui ne sont pas suivis par un double slash (//). Bien sûr, tous les deux-points ne doivent pas être précédés d'un espace car c'est ce qu'on veut corriger.
Exemple :
$dummy = 'Here is an example: a dummy value with : a http:// protocol.';

preg_match_all(
    '#\w+:(?!/)#',
    $dummy,
    $matches
);

print_r($matches);
Produira :

Code : Tout sélectionner

Array ( [0] => Array ( [0] => example: ) )
Si tu t'amuses à enlever l'assertion avant, i.e. seulement utiliser l'expression régulière \w+: tu verras que ça produira :

Code : Tout sélectionner

Array ( [0] => Array ( [0] => example: [1] => http: ) )
L'assertion avant négative a donc une grande utilité :-).