11
votes

Comment ajouter rel = "nofollow" aux liens avec Preg_replace ()

La fonction ci-dessous est conçue pour appliquer des attributs rel = "nofollow" code> à tous les liaisons externes et qu'aucun liens interne, à moins que le chemin correspond à une URL racine prédéfinie définie comme $ my_folder code> ci-dessous.

donné les variables ... p> xxx pré>

et le contenu ... p> xxx pré>

la fin Résultat, après le remplacement doit être ... p>

function save_rseo_nofollow($content) {
$my_folder =  $rseo['nofollow_folder'];
$blog_url = get_bloginfo('url');
    preg_match_all('~<a.*>~isU',$content["post_content"],$matches);
    for ( $i = 0; $i <= sizeof($matches[0]); $i++){
        if ( !preg_match( '~nofollow~is',$matches[0][$i])
            && (preg_match('~' . $my_folder . '~', $matches[0][$i]) 
               || !preg_match( '~'.$blog_url.'~',$matches[0][$i]))){
            $result = trim($matches[0][$i],">");
            $result .= ' rel="nofollow">';
            $content["post_content"] = str_replace($matches[0][$i], $result, $content["post_content"]);
        }
    }
    return $content;
}


6 commentaires

Je pense que Domdocument serait plus agréable à utiliser avec cela.


@alex: ne me faites pas commencer, lol. Je suis sûr que ce serait mais chaque fois que je l'ai essayé, j'ai 4 fois plus de code et ça ne fonctionne jamais exactement correctement. Au moins, je peux faire fonctionner Preg_Match pour travailler, mais il a besoin de modifications mineures. Mais je ne suis pas contre de donner à Dompdocument un autre coup si quelqu'un peut craquer la question avec un exemple Domdocument qui fonctionne sur l'objet Post_Content de WordPress Content Editeur.


Essayez PHPQuery plutôt que lourd DOMDocument. Mais à ce stade, il ne devrait pas non plus aller inutilisé que le déploiement rel = nofollow est assez inutile. Cela n'aide pas avec votre ou quiconque Spam Problème de spam. C'est juste un travail libre afin que Google a moins de travail. Il n'est pas connu d'être une dissuasion pour les spambots non plus.


@Scott B a posté une solution Domdocument qui fonctionne. :)


@Mario je suis d'accord que Domdocument est encombrant. Je pourrais vérifier cette phpelle de temps en temps, merci pour la suggestion :)


Preg_replace_callback est bien bien. Pas besoin d'objets fous ou de beaucoup d'appels de Strows.


9 Réponses :


9
votes

Essayez de le rendre plus lisible en premier, et seulement après que votre si code> Règles plus complexe: xxx pré>

donne la sortie suivante: p>

[post_content] =>
  <a href="http://localhost/mytest/">internal</a>
  <a href="http://localhost/mytest/go/hostgator" rel=nofollow>internal cloaked link</a>    
  <a href="http://cnn.com" rel=nofollow>external</a>


14 commentaires

@Mario: Je l'ai eu. Merci. Comment encapsuleriez-vous les attributs relativités des citations? rel = "nofollow" pour valider?


@Scott: Utilisez retour "<$ tag rel = \" nofollow \ ">"; ou citations simples intérieures à la place.


@Mario: Qu'est-ce que le contenu de l'Arg $? fonction (et $ de contenu)


@Scott: transmet une référence. Mais je viens de remarquer que vous avez besoin d'un retour à la place. Voir Modifier.


@Mario: Erreurs WP sur le contenu et en face du contenu, donc je l'ai supprimé. Maintenant, obtenez-vous> AVERTISSEMENT: Array_Keys () s'attend à ce que le paramètre 1 Pour être une matrice, une chaîne donnée dans C: \ xampplite \ htdocs \ mysite \ wp-inclus \ wp-db.php à la ligne 1222


@Mario: retournez-vous du contenu ou définissez-le simplement une valeur dans Save_rso_nofollow ()? Je n'ai pas besoin de le retourner remplacé?


@Scott: Voir Edition précédente. WP nécessite toujours le retour . Le contenu du tableau est mis à jour juste avant le retour.


@Mario - Je l'ai eu. +1 fonctionne parfaitement jusqu'à présent. Laissez-moi le mettre à travers un feu.


@Scott: Il y a une chose qui peut être optimisée encore. La regex devrait être <(a \ s [^>] +)> ou a \ b [ pour ne pas trébucher sur aucun Tags, etc.


@Mario - Le no_follow_folder peut ou non être défini. Si ce n'est pas défini, cette branche devrait être ignorée. Je tire cette variable d'un tableau de paramètres déclaré à l'extérieur de la fonction. Devrais-je juste le transmettre en ARG? Je l'appelle avec add_filter ('wp_insert_post_data', "sauvegarde_rseo_nofollow");


@Scott: Voir Modifier pour une solution possible. Vous ne pouvez pas tirer dans des arguments là parce que c'est un rappel. S'il s'agit d'une variable de configuration, vous pouvez utiliser global $ my_folder; ou quelque chose de même. Ou simplement préparer plus de elseif des branches pour vos cas spéciaux.


@Mario - Comment coder Exception lorsque My_Folder est vide (non défini)? si donc? En outre, $ my_folder est absolu, non relatif que dans votre ex. Changement de code?


@Mario - Je l'ai eu. Sans faille mais à une exception près. Lorsque My_Folder set mais get_option ('nofollow') n'est pas. Toujours envie de graver interne nfollow, mais pas externe dans ce cas.


@Scott: ajoutez plus si bloque alors pour le garder lisible. Mon soutien se termine ici, je n'écris pas tout le plugin pour vous.



15
votes

Voici la solution Domdocument ... xxx

sortie xxx


1 commentaires

doux. Vérifiez-le maintenant. Merci d'avoir vraiment attaqué la question.



0
votes
<?

$str='<a href="http://localhost/mytest/">internal</a>
<a href="http://localhost/mytest/go/hostgator">internal cloaked link</a>
<a href="http://cnn.com">external</a>';

function test($x){
  if (preg_match('@localhost/mytest/(?!go/)@i',$x[0])>0) return $x[0];
  return 'rel="nofollow" '.$x[0];
}

echo preg_replace_callback('/href=[\'"][^\'"]+/i', 'test', $str);

?>

0 commentaires

3
votes

Utiliser des expressions régulières pour faire ce travail correctement serait assez compliqué. Il serait plus facile d'utiliser un analyseur réel, tel que celui du extension DOM . DOM n'est pas très débutant - ce que vous pouvez faire est de charger le HTML avec DOM, puis exécutez les modifications avec simppexml . Ils sont soutenus par la même bibliothèque, il est donc facile d'utiliser un avec l'autre.

Voici comment il peut ressembler à: p> xxx pré>

comme vous pouvez le voir, c'est vraiment court et simple. Selon vos besoins, vous voudrez peut-être utiliser Preg_Match () Code> à la place de la section Stros () code> Stuff, par exemple: p>

    // change the regexp to your own rules, here we match everything under
    // "http://localhost/mytest/" as long as it's not followed by "go"
    if (preg_match('#^http://localhost/mytest/(?!go)#', $a['href']))
    {
        continue;
    }


2 commentaires

Bonjour, j'ai essayé d'utiliser votre code, mais il ajoute toujours Nofollow à l'URL du blog. de l'aide?


Ce code m'a aidé, mais j'ai rencontré un problème de codage lorsque la chaîne $ HTML contenait des caractères UTF-8 tels que des guillemets bouclés. Remplacer $ DOM-> loadhtml ($ html); avec $ DOM-> loadhtml (mb_convert_coding ($ html, "html-entités '," utf-8')); Correction du problème. Source de corrective: PHP Domdocument Loadhtml non encodé UTF-8 correctement



9
votes

Essayez celui-ci (PHP 5.3 +):

  • Passer l'adresse sélectionnée
  • Autoriser le paramètre rel paramètre rel paramètre manuellement

    et code: xxx

    exemples: xxx


2 commentaires

alors qu'est-ce qui pourrait être fait pour le faire remplacer un rel 'existant?


Merci pour cette solution. Et si je veux transmettre un tableau de la liste de domaines de la liste des domaines, comment puis-je faire cela?



0
votes

Voici la solution une autre solution blanche et ajoutez un attribut vierge de tagret. Et aussi, il vérifie s'il y a déjà un attribut REL avant d'ajouter une nouvelle.

$Page_Content = '<a href="http://localhost/">internal</a>
                 <a href="http://yoursite.com">internal</a>
                 <a href="http://google.com">google</a>
                 <a href="http://example.com" rel="nofollow">example</a>
                 <a href="http://stackoverflow.com" rel="random">stackoverflow</a>';

$Whitelist = ["http://yoursite.com","http://localhost"];

echo Add_Nofollow_Attr($Page_Content,$Whitelist,true);


0 commentaires

1
votes

Merci @Alex pour votre belle solution. Mais, j'avais un problème avec le texte japonais. Je l'ai réparé comme suivant la voie. De plus, ce code peut ignorer plusieurs domaines avec le tableau code> whitelist code>.

public function addRelNoFollow($html, $whiteList = [])
{
    $dom = new \DOMDocument();
    $dom->preserveWhiteSpace = false;
    $dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'));
    $a = $dom->getElementsByTagName('a');

    /** @var \DOMElement $anchor */
    foreach ($a as $anchor) {
        $href = $anchor->attributes->getNamedItem('href')->nodeValue;
        $domain = parse_url($href, PHP_URL_HOST);

        // Skip whiteList domains
        if (in_array($domain, $whiteList, true)) {
            continue;
        }

        // Check & get existing rel attribute values
        $noFollow = 'nofollow';
        $rel = $anchor->attributes->getNamedItem('rel');
        if ($rel) {
            $values = explode(' ', $rel->nodeValue);
            if (in_array($noFollow, $values, true)) {
                continue;
            }
            $values[] = $noFollow;
            $newValue = implode($values, ' ');
        } else {
            $newValue = $noFollow;
        }

        // Create new rel attribute
        $rel = $dom->createAttribute('rel');
        $node = $dom->createTextNode($newValue);
        $rel->appendChild($node);
        $anchor->appendChild($rel);
    }

    // There is a problem with saveHTML() and saveXML(), both of them do not work correctly in Unix.
    // They do not save UTF-8 characters correctly when used in Unix, but they work in Windows.
    // So we need to do as follows. @see https://stackoverflow.com/a/20675396/1710782
    return $dom->saveHTML($dom->documentElement);
}


0 commentaires

0
votes

Décision WordPress:

function replace__method($match) {
    list($original, $tag) = $match;   // regex match groups

    $my_folder =  "/articles";       // re-add quirky config here
    $blog_url = 'https://'.$_SERVER['SERVER_NAME'];

    if (strpos($tag, "nofollow")) {
        return $original;
    }
    elseif (strpos($tag, $blog_url) && (!$my_folder || !strpos($tag, $my_folder))) {
        return $original;
    }
    else {
        return "<$tag rel='nofollow'>";
    }
}

add_filter( 'the_content', 'add_nofollow_to_external_links', 1 );

function add_nofollow_to_external_links( $content ) {
    $content = preg_replace_callback('~<(a\s[^>]+)>~isU', "replace__method", $content);
    return $content;
}


1 commentaires

Un morceau de code sans aucune explication n'est inutile.



-1
votes

Un bon script qui permet d'ajouter Nfoollow automatiquement et de conserver les autres attributs xxx


6 commentaires

S'il vous plaît, ne postez pas deux fois la même réponse. L'autre question est un DUP.


Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses uniquement des liaisons peuvent devenir invalides si la page liée change. - de l'avis


ok il n'a pas de problème


@Toto j'ai corrigé le poteau afin de supprimer la réputation!


Désolé, mais je n'ai pas voté!


@Toto Stackoverflow My bloqué