capturer une URL

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

J'ai un petit bout de code que j'utilise assez régulièrement en PHP pour capturer des URL :

1
2
3
4
5
6
7
8
9
<?
    $patternUrl = '(?xi)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`\!()\[\]{};:\'".,<>?«»“”‘’]))';
    $t = preg_replace_callback("!$patternUrl!i", function($matches){
        if(strlen($matches[0]) > 50){
            return '<a href="'.$matches[0].'">'. substr($matches[0], 0, 20) .' ... '. substr($matches[0], -20) .'</a>';
        } else {
            return '<a href="'.$matches[0].'">'.$matches[0].'</a>'; 
        }
    }, $t);

J'essaye de convertir ce code en JS, mais c'est la que je vois mes limites en regex, je n'y arrive pas.

actuellement j'ai ceci :

1
2
3
4
5
6
7
var t = 'hello http://google.be';
var regex = !(?xi)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`\!()\[\]{};:\'".,<>?«»“”‘’]))!i;

t = t.replace(regex, function($1) {
    console.log($1);
  return '<a href="' + $1 + '">' + $1 + '</a>';
}); 

Et forcément ça ne marche pas. Donc si quelqu'un pouvait me tendre la main ça serait sympa :) .

Merci

+0 -0

Hello,

J'étais curieux de savoir ce que voulaient dire ces (?xi) en début de regex, du coup j'ai cherché et il se trouve que ton problème vient de là :

ce machin est un modificateur inline, et il n'est pas supporté en JS. La bonne nouvelle, c'est que j'ai l'impression que tu n'en as pas besoin : le mode i sur toute la regex, c'est déjà fait avec le flag i que tu as tout à la fin (le i après le !), et le x, c'est juste pour permettre d'écrire sa regex sur plusieurs lignes. Mais comme tu as tout sur une ligne… :)

Edit: Mh, en fait non.

Edit 2: Bon, je me sens con.
En fait il fallait "juste" doubler le backslash du \b au début. Il fallait aussi échapper les slash, et tant qu'à faire j'ai utilisé l'objet RegExp.
Edit 3 : ah et puis le guillemet ", aussi, il faut l'échapper.

1
2
3
4
5
6
7
var t = 'hello http://google.be';
var regex = new RegExp("\\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`\!()\[\]{};:\'\".,<>?«»“”‘’]))","i");

t = t.replace(regex, function(match) {
    console.log(match);
  return '<a href="' + match + '">' + match + '</a>';
});

te donne bien le résultat voulu.

Édité par melepe

+0 -0
Staff

Cette réponse a aidé l'auteur du sujet

1
var regex_url = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`\!()\[\]{};:\'".,<>?«»“”‘’]))/gi;

Ça semble faire l'affaire. Tu peux tester avec Regex101.

Sinon il y a toujours celle-là, plus complète.

Édité par viki53

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte