Forum Clubic

Quelle expression régulière pour mettre des mots en négatif / filtrer des mots?

Bonjour à tous,

Voilà je bloque sur une expression régulière.
Je voudrais rendre cliquable liens liens d’un texte (ex; passer de www.google.fr… à < a href=“http://www.google.fr”>http://www.google.fr )
sauf quand il s’agit d’un image, que j’aimerais pouvoir afficher directement (donc passer de http ://www.leserveur.com/image1.jpg à

Je suis près du but mais je ne trouve pas comment écrire l’expression régulière qui va exclure les liens dont les extensions sont des images (c’est la partie [^(png|jpg|gif)] qui me pose problème , je ne sais pas comment l’écrire ni ou la placer:


$text= preg_replace_callback('#((https?://)[-a-zA-Z0-9@:%_,\+.~\#\&euro;\[\]\{\}\;?&//=][^(png|jpg|gif)])#',
        create_function('$matches',    'return \'<a href=".$matches[1]. \'" target="_blank">\'.$matches[1).	\'</a>\';'),     $text);

Merci par avance pour le coup de main!

Tu peux tenter les assertions positives/négatives, en look ahead ou look behind.
Mais tu peux également le faire via ta fonction, et si tu es en php 5.4 tenter les fonctions anonymes :

$text = preg_replace_callback('#((https?://)[-a-zA-Z0-9@:%_,\+.~\#\&euro;\[\]\{\}\;?&//=][^(png|jpg|gif)])#', function (array $matches) {
  if (preg_match('/\.(jpg|png|gif)$', $matches[0])) {
    return sprintf('<img src="%1$s" alt="[image %1$s]" />', $matches[0]);
  }
  return sprintf('<a href="%1$s">%1$s</a>', $matches[0]);
}, $text);

Et à défaut de la fonction anonyme, tu peux créer une vraie fonction et passer son nom (regarde la doc de preg_replace_callback). ça sera plus propre et plus maintenable qu’une chaîne de caractère.

Maintenant, pour ce que tu veux faire, tel que tu voulais le faire :

fr2.php.net…
fr2.php.net…

Je n’ai pas utilisé la première forme, mais tu dois pouvoir faire une assertion look ahead, et coller un masque qui ne matche pas. En gros, tu peux matcher l’extension, et si tu l’as bien, tu dis que tu prend autre chose (que tu ne peux pas avoir car tu es censé lire l’extension).

Mais perso, je le ferai avec la fonction anonyme :slight_smile: c’est quand même plus simple !

Merci pour ta réponse!
Malheureusement les fonctions anonymes ne passent pas sur ma version de php.
Je vais essayer avec les assertions, si j’arrive à les maîtriser… :yeux4:

Non, dans ce cas, suffit de faire une fonction nommée :slight_smile:

function foobar($matches) {return ..};

preg_replace_callback('...', 'foobar', $text);

Disons qu’une fonction anonyme a l’avantage de ne pas polluer l’espace de nommage pour ce qui n’est pas nécessaire.

Et les assertions négatives, je ne pense pas qu’elles t’aideront. Ou plutôt, le résultat sera plus compliqué que l’utilisation d’une fonction, et ne t’aidera pas dans le futur.