Problème de regex

mohdaef Messages postés 68 Date d'inscription vendredi 23 novembre 2007 Statut Membre Dernière intervention 14 mars 2012 - 25 mai 2010 à 17:03
DiGhan Messages postés 239 Date d'inscription samedi 21 février 2004 Statut Membre Dernière intervention 3 juin 2010 - 28 mai 2010 à 15:53
Bonjour à tous,

Je bloque sur un problème d'expressions régulières.

J'ai réalisé un petit éditeur de texte en Ajax, j'ai implémenté les différentes fonctionnalités des boutons et l'aperçu.

Mais j'ai un soucis sur la mise en forme, lorsque je fait plusieur espaces, quand je récupère le code et l'affiche je n'ai qu'un seule espace d'affiché.
Pour cela je doit remplacer les espaces par , sauf qu'uil ne doivent être remplacés que hors des balies (balies marquées par les symboles [ et ].

Comment dois-je procéder ?

Merci d'avance.

6 réponses

Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
25 mai 2010 à 17:45
Hello

En php ou en JavaScript ?

En php, ca semble marcher :
<?php
$chaine = "  toto tata [titi tutu]  dsds titi [ ds]";
echo $chaine.'
';
function trim_spaces($matches)
{
    return str_replace(" ", '-', $matches[1]).'['.$matches[2].']';
}
$chaine = preg_replace_callback('#(.*)\[(.*)\]#isU', 'trim_spaces', $chaine);
echo $chaine;
/*
  toto tata [titi tutu]  dsds titi [ ds]
--toto-tata-[titi tutu]--dsds-titi-[ ds]
*/
?>


Je te laisse trouver quoi remplacer pour changer les - en ...

_________________________________
Min iPomme
0
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
25 mai 2010 à 17:49
C'est une piste... Ca marche pas toujours mon truck bidul... Je vais essayer d'améliorer ça, dis moi si toi tu y arrive...

Genre pour ca ca marche pas :
<?php
$chaine = "[titi tutu]  texte après ma balise";
$chaine = "Texte sans balise   ";
?>



_________________________________
Min iPomme
0
mohdaef Messages postés 68 Date d'inscription vendredi 23 novembre 2007 Statut Membre Dernière intervention 14 mars 2012
25 mai 2010 à 18:47
Salut.

Merci pour ton aide, c'est vrai je n'ai pas spécifié en quel langage je voulais le faire tout simplement parce qu'il il me faudrait une version javascript pour l'affichage en temps réel et une version php qui se trouve dasn la fonction de traitement du message avant envoi dans la base de donnée.

J'ai un peu de mal à comprendre comment fonctionne ton code je ne suis pas très à l'aise en regex... mais le problème que tu cite des cas qui ne fonctionnent pas j'y avais pensé avant, et comme solution j'avais pensé à : Il faut remplacer tout les espaces par des puis tout les qui se trouve dans des balises les refaire passer en espaces simple.

Tu en pense quoi ?
0
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
25 mai 2010 à 20:44
C'est une solution oui mais ce que j'aime pas trop dans cette solution c'est que tu peux transformer un tappé par l'utilisateur...

Pour ce qui es de ma regex, c'est vrais que je ne l'ai pas expliquée :
#sert de délimiteur à ma regex
(.*)\[( veux dire : tous les caractères se trouvant avant le [
(.*)\] veux dire tout les caractères avant le ].

Ici je créé donc deux groupes d'inconus (.*) tout les caractères avant le [, deuxième groupe (.*) tous les caractères dans le []...
isU : Ce sont les options de la regex.
- i: case insensitive (insensible à la casse)
- s: le caractère spécial . remplace aussi les caractères blancs (\n...)
- U: Ungreedy, s'arrête à la première occurrence trouvée (pratique pour le BBCode, comme dans ton cas).

ensuite preg_replace_callback va appeler la fonction 'trim_spaces' pour les differentes occurences trouvées avec en paramètre les deux groupes de la regex...

Ensuite dans ma fonction trim_spaces, dans le premier groupe je remplace les espaces par des - et je replace le deuxième groupe...

_________________________________
Min iPomme
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mohdaef Messages postés 68 Date d'inscription vendredi 23 novembre 2007 Statut Membre Dernière intervention 14 mars 2012
25 mai 2010 à 21:19
Salut,

Impécable merci pour ton explication, Je pense que même si ma regex était fausse la façon de s'y prendre est pas mal.

Dis moi si je me trompe mais il suffit de remplacer les espaces dans la chaine de caractère qui n'est pas entourée de [ et ] ou bien si il existe ces deux symboles autour il faut que le premier soit fermé et le second ouvert et on récupère la chaine se trouvant entre la fermeture et l'ouverture.

Parcontre si le raisonement est bon je ne sais pas comment le transformer en regex.
0
DiGhan Messages postés 239 Date d'inscription samedi 21 février 2004 Statut Membre Dernière intervention 3 juin 2010 1
28 mai 2010 à 15:53
Bonjour,

Pourquoi ne pas placer le texte parsé entre des balises ?
0
Rejoignez-nous