expression régulière qui supprime des liens consécutifs

WRInaute impliqué
Salut :)

Je propose une petite colle aux experts en expressions régulières qui passeront sur ce post ;)

Après 4h de réflexion intensive à tourner mon expression régulière dans tous les sens sans trouver la bonne formule je me décide à demander de l'aide :lol:

Bref, j'essaie de trouver la formule qui va supprimer les tags et anchors à chaque fois qu'il y a 2 liens ou + qui se suivent.
Je précise que le texte est préformaté et qu'il ne reste que les tags avec les liens et que ceux-ci sont collés les uns aux autres grâce à la première regexp.

Voici mon code :

Code:
$txt="page internet préformatée en ne laissant que le texte et les tags+anchors des liens";

$txt=preg_replace("/>[\s]+</","><",$txt); // supprime les espaces entre les balises qui se suivent

$txt=preg_replace("!(<([aA])(.*?)>(.*?)</([aA])>){2,}!"," ",$txt); // remplace par un espace tous les tags+anchors de liens qui se suivent (quand il y a au moins 2 liens a la suite sans aucun texte qui les séparent)

Dans mes tests je peux affirmer que la regexp seul sans la condition {2,} fonctionne parfaitement et me débarrasse de tous les liens. Cela fonctionne aussi quand la condition est {1,}, tous les liens sont effacés. Le problème apparait quand je dis qu'il faut que la condition se répète avec {2,}...

Si un expert des regexp passe par là ce serait avec plaisir que j'écouterai la solution à mon problème :mrgreen:

Merci ;)
 
WRInaute impliqué
non car en fait pour mieux expliquer :

En fait le contenu avant filtrage c'est le body d'une page internet où j'ai retiré tous les tags sauf ceux des liens+anchors. Donc il ne reste que le contenu ainsi que les balises <a ...>anchor</a>

Pour une représentation simple de ce que devrait faire la fonction je vais schématiser :

0 représentera le contenu (les mots du contenu texte)
X représentera les liens (un X = un lien + anchor)

le body : 0000X0000000XX000XXX0000X000000XX
Le résultat que j'aimerai avoir : 0000X00000000000000X000000

En clair tous les liens + anchors où il y en a au moins 2 consécutifs doivent être supprimés, par contre les liens seuls entourés de texte/contenu doivent être gardés
 
WRInaute passionné
j'ai fait ce test qui semble marcher :
Code:
<?php
$txt = 'debut<a fdsfdsf>lien 1 supprimé</a><a fdsfdsf>lien 2 supprimé</a> millieu <a fdsfdsf>lien 3</a> fin';
echo preg_replace("!<[aA][^>]*>[^<]*</[aA]>(<[aA][^>]*>[^<]*</[aA]>)+!"," ",$txt);
// affiche : debut millieu lien 3 fin
?>
 
WRInaute impliqué
Merci merci merci merci merci merci merci merci merci!!!!!!!!!!!!
Par contre les ^> et ^< je suis pas très friand car ca va poser probleme je pense quand ca va tomber sur une page avec du innerhtml...
Mais j'ai deja une très bonne base pour continuer mes tests alors merci beaucoup!! :mrgreen:
 
WRInaute impliqué
ok c'est parfait je suis arrivé à mes fins. Je supprime tous les onQuelqueChose (donc en meme temps les fonctions utilisants les innerhtml) avant d'appliquer le filtre et tout rentre dans l'ordre.

Merci beaucoup je suis débloqué et peut poursuivre mon projet :mrgreen:
 
Discussions similaires
Haut