Aide Regex avec deux conditions

Bonjour, je ne suis pas du tout doué pour les Regex, et je cherche la syntaxe pour en réaliser une.

On va dire que le mot que je veux matcher est ‘Babar’.

Je veux capturer Babar tout le temps, sauf s’il est dans le “src” d’une balise img, où dans le “href” d’une balise a.
Je tourne rond depuis deux jours. Quelqu’un peut m’aiguiller ?

J’ai presque tout bon dans preg_replace($patern, $replacement, $text), c’est juste la syntaxe de $patern que je ne trouve pas.

Merci d’avance.

Ce que tu veux est possible, mais pas si simple. Il faut utiliser les assertions négatives (cf. doc de php).

Genre

((?!)src=…)Babar

Le problème c’est que ce n’est pas si simple.

Merci beaucoup, j’ai réussi à avancer, cependant, je bloque sur quelque chose. Est-ce que l’on peut “coupler” une assertion négative arrière avec une assertion négative avant ?
Je m’explique, mon $patern est ainsi : ‘#’ . $item->filtre . ‘(?!.)(?!." />)#’ ($filtre->idem donnerait 'Babar" pour l’exemple). Si Babar est dans un Babar, il n’est pas capturé, mais s’il est avant un Autre chose, il n’est pas capturé non plus, car un “” est détecté plus loin.
Ais-je donc la possibilité de dire de ne pas prendre Babar quand il est entre et ?

Tente mais je ne suis pas sûr. Je ne m’en sers pas tant que ça en fait.

Tu devrais réellement envisager une autre méthode (genre strpos(Babar) + vérifier avant et après qu’il n’y a pas src="" ) : tu pourras faire mieux…

Je ne vois pas l’intérêt de strpos dans mon cas !

Son intérêt est de faire la même chose mais sans les regexp? les regexp ne peuvent pas tout non plus.

Je suis d’accord, mais j’ai un object de 700 filtes, avec 700 liens à mettre suivant le match. Dans un texte ou chaque filtre peut-être détecté plusieurs fois, je ne vois pas comment utiliser strpos.

$pattern = "((<a href=)?.Babar.()?) ";

Ensuite tu appliques une fonction à ce tableau, et tu enlèves ceux qui contiennent <a href= …
Enfin, c’est juste une piste…

Oui mais après ? J’en fais quoi de ce tableau ? Le but final est de remplacé des mots par des liens dans un texte, en ce basant sur une relation filtre/lien que j’ai dans une base. Chaque filtre peut apparaitre plusieurs fois dans un texte.

Ben je pensais à un simple strstr()

function recherche_href($chaine)
{
if(strstr($chaine, “<a href”) === FALSE) //Ce “babar” est valide
return $chaine;
else return ‘’;
}

$tab = array_map(“recherche_href”, $tab);

mais bon je vois pas comment adapter dans ton cas. Je pensais que tu voulais juste faire un preg_match_all.