Problème de REGEX avec accents

Résolu
Thebuzz Messages postés 41 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33780 Date d'inscription   Statut Modérateur Dernière intervention   -
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

10 réponses

Thebuzz Messages postés 41 Date d'inscription   Statut Membre Dernière intervention   1
 
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+
1
mamiemando Messages postés 33780 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
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
0
Thebuzz Messages postés 41 Date d'inscription   Statut Membre Dernière intervention   1
 
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
0
mamiemando Messages postés 33780 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
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
0

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

Posez votre question
Thebuzz Messages postés 41 Date d'inscription   Statut Membre Dernière intervention   1
 
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+
0
mamiemando Messages postés 33780 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
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.
0
mamiemando Messages postés 33780 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
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 ?
0
Thebuzz Messages postés 41 Date d'inscription   Statut Membre Dernière intervention   1
 
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+
0
Thebuzz Messages postés 41 Date d'inscription   Statut Membre Dernière intervention   1
 
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+
0
mamiemando Messages postés 33780 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Parfait, félicitations pour avoir résolu ton problème :-)

Bonne continuation
0