Posez votre question Signaler

Problème de REGEX avec accents [Résolu]

Thebuzz 36Messages postés 27 avril 2007Date d'inscription 24 octobre 2010Dernière intervention - Dernière réponse le 16 sept. 2008 à 20:06
Bonjour chers tous,
J'ai un texte tiré d'une base de données contenant cette phrase par exemple :
<J'ai l'énorme probl&eagrave; dans ce codage et avec l'enroulement>
Mon REGEX suivant me permet d'accepter les accents :
"/[a-z-&;]{10,80}/i"
Mais mon affichage est :
l'énorme, problème, l'enroulement,
Mais j'aimerai pouvoir retirer <l'> pour n'afficher que :
énorme, problème, enroulement
Merci de votre aide
Lire la suite 

Problème de REGEX avec accents »

Suggestions
10 réponses
Réponse
+1
moins plus
Merci de tes efforts, mais toujours pas le résultat escompté.

Toutefois, la seule solution pour moi, et qui est fonctionnelle, est de mettre un espace après l'apostrophe de ce style :

l' apostrophe

Comme ceci, mon REGEX
"/(((l|d|qu|jusqu)(&#39;|'))?)([a-zA-Z&;]{5,50})/"
est en partie ok, puisqu'il m'affiche :

l&#...39; apostrophe = apostrophe ( car plus petit que 5 )
s&e...acute;paration = séparation


Merci encore et peut-être que je trouverais plus tard.

A+
Ajouter un commentaire
Réponse
+0
moins plus
Il suffit que ton expression régulière ne "catche" que la partie enroulement. Tu auras le même problème avec "qu'" ceci dit. Je ne connais pas trop la synataxe du langage que tu utilises mais en pcre ça ressemblerait à :
(l')?([a-zA-Z]*)

Bonne chance
Ajouter un commentaire
Réponse
+0
moins plus
Salut mamiemando,

Merci pour ton aide, mais c'est pas fonctionnel. Je m'explique pourquoi :

Mon code ci-dessous est tiré d'une requête SQL avec des données qui ont été modifiées par un remplacement é=>é à=>à, etc...
$q=mysql_query("SELECT products_description FROM description where products_id = 1);
$r=mysql_fetch_array($q);
$texte=$r['products_description'];


Mon code reprend donc cette valeur est doit retourner l'inverse é => é, d'où le &; dans le REGEX. De plus, mon code doit afficher que les mots trouvés contenant un minimum de 5 caractères pour ensuite retirer les doublons et afficher le tout :
if(false !== preg_match_all("/[a-z-&;]{5,80}/i", $texte, $matches)) {
	if(is_array($matches[0]) && sizeof($matches[0])>0) {
		$matches = array_unique($matches[0]);
	}
	
	foreach($matches as $a => $match) {
		$resultats .= $match. ', ';
	}
}


Tout mon code fonctionne, sauf que j'aimerais retirer les types <l'>, <d'>

Cependant, il serait préférable de retourner ma variable $texte, dès le départ, en trouvant tous les équivalents HTML et remettre le codage normal du type é => é, etc...

Merci de votre aide encore
Ajouter un commentaire
Réponse
+0
moins plus
Pour moi c'est juste un traitement supplémentaire sur ton mot (une fois celui-ci extrait). Par exemple
tapir => tapir
l'arbre => arbre

Le rôle de l'expression régulière que je t'ai donné consiste à catcher l' (au même titre que d', qu' etc...) de sorte à n'extraire que le second mot. Ca ne remet en rien en cause le reste de ton code.

Bonne chance
Ajouter un commentaire
Réponse
+0
moins plus
Tu as raison pour le catch, toutefois - on ne peut le voir - tous les accents et apostrophes sont formatés avec le codage html &...;

Mon ennui viens donc d'éviter de catcher les l&ap..; mais de catcher les autres codes tel &ea...;=>é &eg...;=>è, etc...

C'est en fait mon ennui car l'affiche se fait - pas tout à fait - correctement avec ces réponses selon ma requête {5,80} :

r&ea...;pondeur = répondeur
acc&eg...;s = accès

mais l&ap...;erreur = l'erreur, ne devrait prendre que = erreur. Donc seul les valeurs &ap...; et &#...; qui sont des apostrophes ne doivent pas être catchés.

J'espère pouvoir trouver une solution, merci

A+
Ajouter un commentaire
Réponse
+0
moins plus
Ben ton expression régulière sera juste un truc du genre
(((l|d|qu)(&ap...;|'))?)([a-zA-Z&;]*)

Non ? En remplaçant &ap...; par la bonne balise HTML. Sinon au lieu de faire une expression régulière tu traites directement la chaîne en recherchant le motif apostrophe.
Ajouter un commentaire
Réponse
+0
moins plus
Au pire tu le fais en deux temps.
- Une première regexp qui filtre les l'/d'/qu'...
- et une seconde qui une fois le mot nettoyé, vérifie que la seconde moitié fait plus de 5 caractères.

En fait dans quel cas ta regexp actuelle ne marche pas ?
Ajouter un commentaire
Réponse
+0
moins plus
Merci encore pour te pencher sur mon prob,

Effectivement uniquement sur les apostrophes, car le format est :

l&#...39;apostrophe = l'apostrophe

et mon affichage selon mon code est = 'apostrophe

C'est le code &#...39; correspondant à l'apostrophe qui n'est pas correctement retiré

A+
Ajouter un commentaire
Réponse
+0
moins plus
Salut pour terminer,

J'ai résolu mon souci...

En fait, j'ai pris depuis la souche, le résultat de ma requête et je remplace le fameux caractère &#...39; par un espace.

est le REGEX est ensuite :
"/(((l&apos;|d&apos;|qu&apos;|jusqu&apos;)('))?)([a-zA-Z&;]{5,50})/"


Tout baigne dans la place....


Merci à toi, mamiemando, pour ton aide qui m'a permis de forcer le passage

MERCI

A+
Ajouter un commentaire
Réponse
+0
moins plus
Parfait, félicitations pour avoir résolu ton problème :-)

Bonne continuation
Ajouter un commentaire
Ce document intitulé « Problème de REGEX avec accents » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?