1
votes

Expression régulière pour rechercher des liens d'images dans une chaîne

J'ai une chaîne comme celle-ci https://images.pexels.com/photos/459225/pexels-photo-459225.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500 et j'ai besoin pour définir si ce lien image ou non.

J'ai trouvé l'expression régulière /(http(s?):)([/|.|\w|\s|- )*\.(?:jpg|gif|png)/g qui définit l'image si le lien a un format approprié à la fin, mais cette expression régulière ne fonctionne pas avec un tel lien https://images.pexels.com/photos/459225/pexels-photo-459225.jpeg? auto = compress & cs = tinysrgb & dpr = 1 & w = 500

Je ne suis pas familier avec les expressions régulières, alors pouvez-vous m'aider à améliorer cette expression régulière et définir un tel lien. Merci


2 commentaires

Vous avez un caractère / non échappé dans l'expression régulière


@DominikMatis [/] est valide dans les littéraux de regex dans la plupart des JS implémentations de regex.


5 Réponses :


0
votes

Modifiez simplement l'expression régulière comme ceci:

 /(http(s?):)([\/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png)/g 


3 commentaires

J'ai voté contre parce que le modèle n'est pas valide, essayez-le sur regex101.com


Bon ok mais l'expression originale est également invalide


@DominikMatis [/] est valide une fois que vous avez sélectionné le bon moteur . Pas besoin de se précipiter avec un vote négatif.



0
votes

Vous devez échapper à ce / dans l'expression régulière, donc c'est correct

/(http(s?):)([\/|.|\w|\s|-])*\.(?:jpg|jpeg|gif|png)/g


1 commentaires

Dans la plupart des implémentations de regex JS, dans une classe de caractères à l'intérieur d'un littéral regex, / sans échappement est valide.



0
votes

Vous pouvez raccourcir considérablement votre expression existante en réduisant certains de vos groupes de capture, ainsi qu'en supprimant les caractères pipe de votre jeu de caractères [] . Les jeux de caractères se comportent automatiquement comme des instructions "OR" sans utiliser de tuyaux.

/(https?:)([\/.\w\s-])*\.(?:(jpe?|pn)g|gif)/gi

Pour disséquer cette expression et voir pourquoi elle fonctionne, regardez-la sur RegExr .


0 commentaires

0
votes

Cette expression régulière est trop restrictive car la validation de domaine est peu performante, vous pouvez donc la desserrer comme ceci:

https?:\/\/[^.]*?(\.[^.]+?)*\/.*?\.(jpg|jpeg|gif|png)

https://regex101.com/r/ZXyOkQ/2


0 commentaires

0
votes

Vous pouvez utiliser URL api et test

let str = `https://images.pexels.com/photos/459225/pexels-photo-459225.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500`
let str2 = `https://images.pexels.com/photos/459225/pexels-photo-459225.exe?auto=compress&cs=tinysrgb&dpr=1&w=500`

let isImage = (str) =>{
  let parsed = new URL(str)
  return /(?:jpe?g|gif|png)$/i.test(parsed.pathname)
} 

console.log(isImage(str))
console.log(isImage(str2))


0 commentaires