[Résolu] Expressions régulières... je bloque. :(

Expressions régulières... je bloque. :( [Résolu] - PHP - Programmation

Marsh Posté le 24-08-2009 à 15:28:36    

Bonjour à tous,
 
je bloque sur une expression régulière depuis quelques heures, mais là je donne ma langue au chat. :(
Je vous explique mon problème.
 
Je dois, dans un texte, retrouver toutes les occurences d'un mot. Jusque là rien de bien compliqué.
Mais il y a plusieurs règles qui entrent en jeu pour que le mot soit matché.
 
Le mot ne peut en aucun cas être entouré d'une balise <a>. Le mot ne peux en aucun cas être précédé/suivi d'un caractère alphanumerique.
Voici un exemple de ce qui doit matcher et de ce qui ne doit pas matcher pour la chaîne "abc" :
 
 


<a>abc</a>  -> 0
<a>abcde</a>  -> 0
xyzabc123   -> 0
abc    -> 1
xyz abc 123  -> 1
<p>abc</p>  -> 1
<p>abc abc</p>  -> 1
<p>xyz abc 123</p> -> 1


 
 
 
Mon problème vient du fait que je n'arrive pas à mettre en musique ces deux conditions...
 
J'avais à la base écrit ceci comme regexp :
 

Code :
  1. $pattern='/(<a[^>]*> )?(abc)(<\/a> )?/i';


 
Mais avec ce pattern ci, les chaines suivantes vont matcher :


xyzabc123  
<p>xyzabc123</p>


 
Donc voilà si vous avez une idée, votre aide me serait vraiment très précieuse...  
 
Un grand merci d'avance à tout ceux qui tenteront de m'aider :)
 
V.

Message cité 1 fois
Message édité par Vitaminae le 09-12-2009 à 12:18:08

---------------
Humour :: http://www.chadechire.com
Reply

Marsh Posté le 24-08-2009 à 15:28:36   

Reply

Marsh Posté le 26-08-2009 à 23:26:12    

Vitaminae a écrit :


Mais avec ce pattern ci, les chaines suivantes vont matcher :


xyzabc123  
<p>xyzabc123</p>



 

Normal, ces chaines remplissent les conditions énoncées :

 
Citation :

Le mot ne peut en aucun cas être entouré d'une balise <a>. Le mot ne peux en aucun cas être précédé/suivi d'un caractère alphanumerique.

 

[:spamafoote]

 

T'as du oublier des conditions... Pour moi, d'après ce que tu décris, ça marche :D

Message cité 1 fois
Message édité par theredled le 26-08-2009 à 23:27:00

---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Marsh Posté le 27-08-2009 à 10:14:23    

theredled a écrit :


 
Normal, ces chaines remplissent les conditions énoncées :
 

Citation :

Le mot ne peut en aucun cas être entouré d'une balise <a>. Le mot ne peux en aucun cas être précédé/suivi d'un caractère alphanumerique.




 
Salut et merci pour ta réponse.
 
Non vu que il y a des lettres devant et derrière la chaîne abc et ca match quand même hors je ne veux pas que ca matche et je n'arrive pas a faire cohabiter les deux conditions (celle là et celle de la balise <a> ). C justement ca mon soucis
 
Donc :
 
azabcde  ne doit pas matcher (or la ca matche)
 
abc doit matcher
 
en gros ca doit matcher que si le mot est vraiment un mot et pas un mot composé...
 
 
V.

Message cité 1 fois
Message édité par Vitaminae le 09-12-2009 à 12:18:32

---------------
Humour :: http://www.chadechire.com
Reply

Marsh Posté le 27-08-2009 à 10:20:46    

Vitaminae a écrit :


 
Salut et merci pour ta réponse.
 
Non vu que il y a des lettres devant et derrière la chaîne abc et ca match quand même hors je ne veux pas que ca matche et je n'arrive pas a faire cohabiter les deux conditions (celle là et celle de la balise <a> ). C justement ca mon soucis
 
Donc :
 
azabcde  ne doit pas matcher (hors la ca matche)
 
abc doit matcher
 
en gros ca doit matcher que si le mot est vraiment un mot et pas un mot composé...
 
 
V.


Concrètement, le mot est prévu à l'avance, et c'est toujours "abc" ?


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Marsh Posté le 27-08-2009 à 10:47:42    

On va dire que oui car le pattern que je génère, c'est avec une variable c'est pour ca que dans mon exemple j'ai mis "abc".
 
en fait j'ai une liste de mots et je génère le pattern à utiliser pour chaque mots.
 
Pour simplifier mon explication j'ai donc mis abc car c pas le soucis ;)
 
Merci à toi.
 
V.


Message édité par Vitaminae le 27-08-2009 à 10:49:59
Reply

Marsh Posté le 27-08-2009 à 10:54:18    

J'ai pas trop le temps, mais tu peux p-e aller voir du côté des assertions lookahead/lookbehind  
http://www.regular-expressions.info/lookaround.html


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Marsh Posté le 27-08-2009 à 11:37:47    

Bingo. Je ne connaissais pas les assertions, j'ai résolu mon problème, merci beaucoup !!! :)
 
Si ça peut aider quelqu'un un jour :
 

Code :
  1. $pattern='/(<a[^>]*> )?((?<!(\w))abc(?!(\w)))(<\/a> )?/i';


Message édité par Vitaminae le 09-12-2009 à 12:18:44

---------------
Humour :: http://www.chadechire.com
Reply

Marsh Posté le 27-08-2009 à 12:13:18    

Ah bah nickel :D


---------------
Contes de fées en yaourt --- --- zed, souviens-toi de ma dernière lettre. --- Rate ta musique
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed