8791 sujets

Développement web côté serveur, CMS

Bonjour,

N'ayant aucune expérience en regex je n'arrive pas à savoir si on peut ou pas faire la chose suivante en php:

Dans le html d'une page générée, tester chaque lien.
(En l'occurrence les liens externes (dans mon cas contenant http://.)

Pour chacun d'eux, y a t il déja une class définie ?
Si oui on ajoute une autre class (par exemple: "lien-ext")
Sinon on ajoute class="lien-ext".

Ca doit bien exister déjà ?

Merci
Modifié par elz64 (30 Sep 2010 - 16:15)
Le principe est assez simple dans ton cas... et pas besoin de regex d'ailleurs.

Ce que tu vas demander à php c'est :

$chaine=la chaine de caractère à tester;
if(y pas "class" dans tel chaine de caractère ($chaine))
{
   tu divises la chaine ($chaine) en $chaine1='<a ' et $chaine2='le reste';
   puis tu changes la variable pour qu'elle fasse $chaine=$chaine1.'class=\"lien-ext\".$chaine2;
}


il va te falloir :
la fonction strripos pour vérifier si class est dans $chaine
la fonction strtok pour segmenter ta chaine

(y a peut-être mieux pour segmenter les chaînes, je le fais jamais perso^^)
Modifié par Lothindil (30 Sep 2010 - 16:25)
hum merci,

mais, jeparle bien de parser l'intégralité du dom, et tous ses liens.

Comment on arrive à une "chaine à tester" ? (je décode vaguement le php mais là on va dire que c'est formateur)

c'est pourquoi je pensais d'abords à preg_replace
ah ouais, là ça complique...

en gros tu cherches à faire un remplacement sur l'entièreté des pages de ton site ou j'ai mal compris ? Smiley biggol

C'est pas plus simple de faire ça avec ton éditeur de code ? Smiley ohwell


en fait là la question c'est plutôt de savoir dans quel cadre tu veux l'utiliser, et quel est ton objectif...

(bon, je préviens, la manipulation de chaînes de caractères, c'est pas mon domaine favori dans le php^^)
A chaque générétion de la page (Modx) le plugin que je cherche à réaliser va automatiquement mettre à jour les class des liens en "liens-ext" s'il s'agit d'un href pointant vers dehors (on verra les internes + tard).

L'API de Modx permet d'avoir le dom (dans un array je pense)
en faisant ca :
$text = $modx->documentOutput;


dans $text il faut traiter chaque lien.

But avoir de manière sûr une class lien-ext (ou pas) selon le cas pour styler, précisément pour ne pas le faire depuis le RTE. (et pour qu'un rédacteur ne l'oublie pas)

J'ajoute que je veux en plus ajouter un rel="external"

voilà ce que j'ai mais ce n'est pas idiot proof. Ca casse l'éventuelle class déjà présente le cas échéant.
$extlink_class = 'lien-externe';

    $text = $modx->documentOutput;
    // search and replace external Links in document    
            $modx->documentOutput = str_replace('base href="http://','basehref="http://',$modx->documentOutput);
            
              $modx->documentOutput = str_replace(' href="http://',' class="'.$extlink_class.'" rel="external" href="http://',$modx->documentOutput);
        
          $modx->documentOutput = str_replace('basehref="http://','base href="http://',$modx->documentOutput);

    

    
        return; // stop