Soucis Regex et string.search javascript

Soucis Regex et string.search javascript - Javascript/Node.js - Programmation

Marsh Posté le 12-06-2019 à 00:14:22    

Salut!
 
Je rencontre un soucis en ce moment en javascript. Je souhaiterai récupérer du texte entre deux balises <url> et </url>.
Pour faire ça, j'ai écris le code suivant:
 
(result contient une phrase du style <url>blablabla</url> )
url = result.search('<url>(.*?)<\/url>')
 
Le soucis, c'est que url contient constamment 0, peut importe ce que je rentre comme phrase.
 
Une idée?
Merci!


---------------
----** Mon feed-back **----
Reply

Marsh Posté le 12-06-2019 à 00:14:22   

Reply

Marsh Posté le 12-06-2019 à 09:27:35    

Bonjour,
 
Dans ce cas là, je pense que la méthode string.exec est plus appropriée. De plus à quoi sert ton point d'interrogation dans ton regex ? Tu peux l'enlever, l'astérisque fait déjà le taff.
Il est aussi possible que tu aies besoin de préciser le flag de multiligne en fonction de ta chaîne de caractères.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 12-06-2019 à 12:32:07    

MaybeEijOrNot a écrit :

Bonjour,
 
Dans ce cas là, je pense que la méthode string.exec est plus appropriée. De plus à quoi sert ton point d'interrogation dans ton regex ? Tu peux l'enlever, l'astérisque fait déjà le taff.
Il est aussi possible que tu aies besoin de préciser le flag de multiligne en fonction de ta chaîne de caractères.


le point d'interrogation c'est pour faire en sorte que le * soit lazy et non greedy : https://www.rexegg.com/regex-quantifiers.html
 
Sinon tu récupères tout entre le premier <url> et le dernier </url> de la string, et donc même les autres <url> et </url> qui trainent

Reply

Marsh Posté le 12-06-2019 à 13:41:57    

Merci, je ne savais pas qu'on pouvait faire ça comme ça, sur le moteur PCRE j'utilise le flag U pour "Ungreedy" mais ce dernier n'existe pas sur le moteur JS.


Message édité par MaybeEijOrNot le 12-06-2019 à 13:42:27

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 12-06-2019 à 19:58:12    

Merci pour vos réponses, j'avance mais je galère toujours.
J'ai changé de méthode js, j'utilise string.match qui a l'air d'être plus faite pour ça.
 
Sur https://regex101.com/, quand je mets cette chaîne: <url>(.*?)<\/url>
et que je teste par exemple <url>test</url> ça fonctionne et me sort bien "test".
 
Par contre, quand le fais la même chose dans mon code js avec
result.match('<start>(.*?)<end>'), ça ne fonctionne pas...
 
EDIT: autant pour moi! En fait ça fonctionne, mais le résultat est un tableau avec en position 0, la phrase entière et en position 1 ce qui est réellement entre les deux balises... :)


Message édité par Hig2 le 12-06-2019 à 20:02:07

---------------
----** Mon feed-back **----
Reply

Marsh Posté le 12-06-2019 à 20:24:47    

exactement string.match est vraiment faite pour ça
 
et

Code :
  1. result.match('<start>(.*?)<end>')


c'est pas un expression régulière hein

Reply

Marsh Posté le 12-06-2019 à 21:46:21    

Heu oui pardon, c'est un vieux morceau de code que j'avais testé, c'est plutôt celui-ci que j'utilise actuellement:
result.match('<url>(.*?)</url>')
 
Mais pourquoi dis-tu que ce n'est pas une expression régulière?


Message édité par Hig2 le 12-06-2019 à 21:46:49

---------------
----** Mon feed-back **----
Reply

Marsh Posté le 12-06-2019 à 23:05:03    

parce que String.match prend en paramètre une expression régulière et là tu lui balances une chaîne de caractère.
Le mieux c'est de faire ça  :

Code :
  1. string.match(/<url>(.*?)<\/url>/)
 

D'ailleurs combien veux-tu récupérer de <url></url> dans ta string ?
Car si tu veux tous les récupérer le flag /g est mieux et si tu ne veux garder que le contenu il faudra passer par deux étapes, un match puis un map .

 
Code :
  1. var reg = /<url>(.*?)<\/url>/g;
  2. var result = ("<url>fdsfsdfsd</url>sdfsdf<url>totot</url>".match(reg) || []).map(function(str) {
  3. return str.replace(reg, '$1');
  4. });
 

Sinon il y a d'autres solutions :

Code :
  1. var result;
  2. var str = "<url>fdsfsdfsd</url>sdfsdf<url>totot</url>";
  3. var regex = /<url>(.*?)<\/url>/g;
  4. // ==============================
  5. result = (str.match(regex) || []).map(function(str) {
  6.   return str.replace(regex, "$1" );
  7. });
  8. // ==============================
  9. result = [];
  10. str.replace(regex, function(a, match) {
  11.   result.push(match);
  12. });
  13. // ==============================
  14. result = Array.from(str.matchAll(regex), function(x) {
  15.   return x[1];
  16. });
  17. // ==============================
  18. console.log(result);


Message édité par gatsu35 le 12-06-2019 à 23:19:25
Reply

Marsh Posté le 13-06-2019 à 07:17:06    

Merci gatsu35 :)
Je ne souhaite récupérer qu'un seul flag. C'est pour faire des tests sur une réponse en ajax et rediriger l'utilisateur en fonction de ce qui est entre les balises.
Si la réponse ajax contient <url> alors je récupère ce qui est entre les deux balises url et je redirige vers cette page. La string sera donc toujours de ce type <url>page vers laquelle faire la redirection</url>.


---------------
----** Mon feed-back **----
Reply

Marsh Posté le 13-06-2019 à 09:20:44    

Si tu as la main sur la réponse, une réponse sous forme Json sera plus facile à traiter.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Sujets relatifs:

Leave a Replay

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