[PHP] Regex Complexe

Bonjour,

je monte un script qui me permet de supprimer d'un site tous les liens sortants vers un NDD domain.tld

j'ai tenté la regex suivante :

Code:
preg_match('#<a.*?href=\"http:\/\/www.domain.tld.*?\".*?>(.*?)<\/a>#', $content, $out);

Pourquoi le premier .*? ???

Pour pouvoir gérer les cas où l'attribut title ou class du lien est placé entre le <a et le href.

Tout marche bien sauf dans les textes où plusieurs liens sont présents, car le premier .*? me prend tout le code compris entre l'ouverture du premier <a et le href du dernier lien vers domain.tld

Je bloque depuis hier. Merci pour votre aide.
 
ou alors faire après le premier <a un masque du type : tout sauf <a, ce qui prendra uniquement la dernière balise a ouvrante.

Mais je n'arrive pas à l'écrire
 
Pourquoi autant d'anti-slashes ? Pas besoin d'en mettre devant les guillements ni les "/".
Par contre, il en faut devant les points à considérer comme un caractère.
J'utiliserai les options suivantes :
"U" pour le coté non gourmand
"m" pour le multi lignes (il peut y avoir des retours à la ligne entre les attributs et dans le contenu texte du lien.
"i" pour la casse : href peut être écrit HREF parfois ou encore les balise en majuscule.
"s" pour que le "." puisse prendre les retours à la ligne.
Je te propose cette RegExp (avec d'autre "correction") :
PHP:
<span class="syntaxdefault">preg_match</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'#<a.+href="http://www\.domain\.tld[^"]*"[^>]*>(.*)</a>#Umis'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $content</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $out</span><span class="syntaxkeyword">);</span><span class="syntaxdefault"> </span>
 
J'ai fais des corrections dans mon précédents messages. Regarde si tu as bien la dernière version de la RegExp.
 
Ça nous aide pas vraiment.
Chez moi, mon test fonctionne très bien :
PHP:
<span class="syntaxdefault"></span><span class="syntaxkeyword"><?</span><span class="syntaxdefault">php<br />$content </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> </span><span class="syntaxstring">'fgdfjg fgdsfg<br />fdgsdg<br />gdfgg<br /><br />fgdg<br /><a href="http://www.domain.tld/test">dsfs<br />fsdf<br />sdf</a><br />sdfds<br />'</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">preg_match</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'#<a.+href="http://www\.domain\.tld[^"]*"[^>]*>(.*)</a>#Umis'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $content</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $out</span><span class="syntaxkeyword">);<br /><br /></span><span class="syntaxdefault">var_dump</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$out</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault"> </span>

Code:
array(2) {
  [0] =>
  string(54) "<a href="http://www.domain.tld/test">dsfs\nfsdf\nsdf</a>"
  [1] =>
  string(13) "dsfs\nfsdf\nsdf"
}

Tu as cherché d'où pourrait venir l'erreur ?

Sinon, pour le coté remplacement, il faudra regarder du coté de preg_replace.
 
en fait comme expliqué plus haut

Tout marche bien sauf dans les textes où plusieurs liens sont présents, car le premier .*? me prend tout le code compris entre l'ouverture du premier <a et le href du dernier lien vers domain.tld

il faut donc tester avec un content de ce type :

Code:
le début de mon texte blabla vkd <a title="Info France" href="http://www.autre_domaine.tld/" target="_blank"><strong>anchor 1</strong></a> en 2009, ce sera aussi et essentiellement superviser la fin des travaux, avec des  <a title="title bulldozer" href="http://www.domain.tld/bulldozer.php" target="_blank"><strong>bulldozers</strong></a> ma fin de mon texte blabla
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut