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

Signaler
Messages postés
41
Date d'inscription
vendredi 27 avril 2007
Statut
Membre
Dernière intervention
24 octobre 2010
-
Messages postés
29711
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
12 avril 2021
-
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

Messages postés
41
Date d'inscription
vendredi 27 avril 2007
Statut
Membre
Dernière intervention
24 octobre 2010
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 65492 internautes nous ont dit merci ce mois-ci

Messages postés
29711
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
12 avril 2021
7 067
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
Messages postés
41
Date d'inscription
vendredi 27 avril 2007
Statut
Membre
Dernière intervention
24 octobre 2010
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
Messages postés
29711
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
12 avril 2021
7 067
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
Messages postés
41
Date d'inscription
vendredi 27 avril 2007
Statut
Membre
Dernière intervention
24 octobre 2010
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+
Messages postés
29711
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
12 avril 2021
7 067
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.
Messages postés
29711
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
12 avril 2021
7 067
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 ?
Messages postés
41
Date d'inscription
vendredi 27 avril 2007
Statut
Membre
Dernière intervention
24 octobre 2010
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+
Messages postés
41
Date d'inscription
vendredi 27 avril 2007
Statut
Membre
Dernière intervention
24 octobre 2010
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+
Messages postés
29711
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
12 avril 2021
7 067
Parfait, félicitations pour avoir résolu ton problème :-)

Bonne continuation