[PHP] Regex Complexe

WRInaute discret
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.
 
WRInaute discret
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
 
WRInaute impliqué
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>
 
WRInaute impliqué
J'ai fais des corrections dans mon précédents messages. Regarde si tu as bien la dernière version de la RegExp.
 
WRInaute impliqué
Ç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.
 
WRInaute discret
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
 
Discussions similaires
Haut