[C#] aide sur un regex.

aide sur un regex. [C#] - C#/.NET managed - Programmation

Marsh Posté le 13-04-2009 à 20:26:08    

Bonjour à tous, je débute avec les regex et je galére grave.. voici qq exemple  
 
un qui marche
 
dans mon code html voici le code original
 

Code :
  1. <html dir="ltr">


 
voici le code de mon regex qui fonctionne très bien
 

Code :
  1. Regex regexObj = new Regex("<html dir=\"(.*)\">" );


 
voici le code html original que je veux trouver

Code :
  1. <a href="./details.php?image_id=1363&amp;mode=search">


 
je veux récupérer 1363, voici un de mes codes regex qui ne marche pas !

Code :
  1. new Regex("<a href=\"./details.php?image_id=([.]*)&amp" );


 
j'en ai essayer plein mais je n'y arrive pas merci de votre aide, l'id est toujours composé de chiffres.


Message édité par flclsd le 13-04-2009 à 20:26:36
Reply

Marsh Posté le 13-04-2009 à 20:26:08   

Reply

Marsh Posté le 14-04-2009 à 01:57:28    

Simple problème d'échappement de caractères. Tu as bien échappé les guillemets mais pas le "." ni le "?"
 
Quand tu as un doute sur un caractère, pour être tranquille, pense toujours à l'échapper.
 

Code :
  1. new Regex("\<a href\=\"\.\/details\.php\?image_id\=([.]*)\&amp" )


Message édité par Kormyr le 14-04-2009 à 02:02:36
Reply

Marsh Posté le 14-04-2009 à 09:47:36    

merci de ta réponse, j'ai cru comprendre les caractères d'échappement donc j'ai essayé et ca ne marche pas, j'ai copier le code que tu m'indique et ca ne marche pas non plus,  
 
le code apparait surligné en rouge et me retourne une erreur sur la séquence d'échappement.

Reply

Marsh Posté le 14-04-2009 à 09:48:26    

.+?

Reply

Marsh Posté le 14-04-2009 à 09:48:41    

Le HTML c'est comme le XML, ça se parse pas avec des regex [:sadnoir]

 

Sinon, image_id=(\d+)


Message édité par masklinn le 14-04-2009 à 09:49:55

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 14-04-2009 à 11:44:43    

@ flclsd : C'est quoi comme erreur ?
@Masklinn : oui en effet \d+ fait plus "propre", cependant .* devrait avoir le même effet, même s'il accepte plus de possibilités.

Reply

Marsh Posté le 14-04-2009 à 11:48:38    

Kormyr a écrit :

@ flclsd : C'est quoi comme erreur ?
@Masklinn : oui en effet \d+ fait plus "propre", cependant .* devrait avoir le même effet, même s'il accepte plus de possibilités.


Sauf que ? sinon il te bouffe tout

Reply

Marsh Posté le 14-04-2009 à 12:03:16    

Kormyr a écrit :

cependant .* devrait avoir le même effet, même s'il accepte plus de possibilités.


Ben non, \d+ s'arrête quand il n'a plus de chiffres à consommer (donc juste avant le "&" ), alors que ".*" va jusqu'au bout de la page [:spamafote]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 14-04-2009 à 12:12:26    

Code :
  1. Regex r = new Regex("<a href=\"\\./details\\.php\\?image_id=(\\d+)&" );


 
Il faut 2 "\", sinon en effet le & est facultatif avec \d


Message édité par Kormyr le 14-04-2009 à 12:14:10
Reply

Marsh Posté le 14-04-2009 à 18:41:14    

ok, je teste ca se soir, je suis au taff la ..
 

Code :
  1. <img src="./data/media/1/mon_image.jpg" border="1" alt="" width="" height="" /><br />


 
 l'autre regex que j'ai a faire est pour récuperer ce qui suit media/ dans le code ci dessus, est ce qu'on est d'accord que cette regex devrait fonctionner.
 

Code :
  1. new Regex("<img src=\"\\./data/media/(.*)\"" );

Reply

Marsh Posté le 14-04-2009 à 18:41:14   

Reply

Marsh Posté le 14-04-2009 à 18:45:03    

Non mais stop, arrêtes d'utiliser des regex pour ça [:sisicaivrai]


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 14-04-2009 à 18:51:13    

lol, je débute et il y a que ca que j'arrive à peu près a comprendre.. :-)
j'ai que ces 2 lignes à récuperer, c tout..
 
tu me suggére d'utiliser quoi ?

Message cité 1 fois
Message édité par flclsd le 14-04-2009 à 18:51:31
Reply

Marsh Posté le 14-04-2009 à 19:06:48    

flclsd a écrit :

lol, je débute et il y a que ca que j'arrive à peu près a comprendre.. :-)
j'ai que ces 2 lignes à récuperer, c tout..

 

tu me suggére d'utiliser quoi ?


Une lib qui sait parser du HTML (il y a ptet même ça directement dans le framework)

 

edit: http://htmlagilitypack.codeplex.com/ par exemple, qui permet de faire des queries XPath.


Message édité par masklinn le 14-04-2009 à 19:09:04

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 14-04-2009 à 19:34:07    

Si quelqu'un connais un équivalent intégré au framework ça m'intéresse, ça serait quand même bizarre que personne n'y ait pensé.
 
Sinon pour apprendre les regexp les pages HTML c'est pas mal ^^

Reply

Marsh Posté le 14-04-2009 à 21:52:49    

bon je continue dans ma galére.. c baléze quand meme les regex  :lol:  
 
pour ce code html la  

Code :
  1. <img src="./data/media/1/mon_image.jpg" border="1" alt="" width="" height="" /><br />
  2. [code]
  3. j'utilise ce regex que j'avais indiqué :
  4. [code]
  5. new Regex("<img src=\"\\./data/media/(.*)\"" );


 
ca fonctionne bien, mais je récupere toute la fin de la chaine

Code :
  1. " border="1" alt="" width="" height="" /><br />

qui ne m'interresse pas et j'arrive pas à m'arreter juste avant le " cad juste

Code :
  1. 1/mon_image.jpg


 
j'ai essaye entre autre ca :  
 

Code :
  1. new Regex("<img src=\"\\./data/media/(.*)[\"]$" );

 
 
mais comme vous le devinez ca marche pas !!
 

Reply

Marsh Posté le 14-04-2009 à 22:04:24    

flclsd a écrit :

bon je continue dans ma galére.. c baléze quand meme les regex  :lol:


C'est surtout complètement con de les utiliser pour parser du HTML, mais bon apparement tu t'en fous.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 14-04-2009 à 22:05:57    

c'est pas que je m'en fous, mais je regarderais une autre solution quand j'aurais bcq plus de code a parser.. pour 2 lignes les regex ca le fait ! et c rapide donc..

Reply

Marsh Posté le 14-04-2009 à 22:12:14    

J'en ai essayé 2 qui marchent :
 

Code :
  1. Regex r = new Regex("<img src=\"\\./data/media/(.*)\" border" );


 

Code :
  1. Regex r = new Regex("<img src=\"\\./data/media/(.*\\.jpg)" );


 
La 2e est mieux si tu est sûr d'avoir des jpg

Reply

Marsh Posté le 15-04-2009 à 20:58:01    

merci bcq monsieur !! va falloir que je travaille mes regex !-)

Reply

Marsh Posté le 26-04-2009 à 11:55:08    

En admettant que tu conserves le parse par regex (ce que moi aussi je trouve très maladroit dans ton cas, tu ferais mieux d'interpréter tes fichiers comme étant du XML avec XPath ou LINQ to xml, ou même d'utiliser une lib dédiée au  HTML), tu devrais préfixer toutes tes regex par "@", ce qui a pour effet de désactiver dans la chaîne les séquences d'échappement au niveau du compilo, ce qui t'épargnerait de devoir échapper (compilo) des séquences d'échappement (regex) :sarcastic:, comme tu le fais avec "\\.".


Message édité par TotalRecall le 26-04-2009 à 11:55:26

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 30-04-2009 à 13:46:39    

le code de Kormyr fonctionne très bien par contre je viens de rencontrer un problème si l'image commence par un chiffre :
 
rappel du regex utilisé :  
 

Code :
  1. Regex r = new Regex("<img src=\"\\./data/media/(.*\\.jpg)" );


 
lecture de code fontionne très bien :
 

Code :
  1. <img src="./data/media/1/Erasure.jpg" border="1" alt="Erasure" /><br />


 
mais celui ci ne marche pas, la seule différence dans ce cas est le 2, j'ai essayé plusieurs ca si ca commence par un chiffre ca ne marche pas .. bizzare quand meme..
 

Code :
  1. <img src="./data/media/1/2_Erasure.jpg" border="1" alt="2 Erasure"  /><br />


 
@ TotalRecall, je vais utiliser le @ merci de l'astuce.


Message édité par flclsd le 30-04-2009 à 13:46:56
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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