Comment ajouter rel = "nofollow" aux liens avec preg_replace ()
La fonction ci-dessous est conçu pour s'appliquer attributs pour tous les liens externes et pas de liens internes, à moins que le chemin d'accès correspond à une valeur de la racine de l'URL définie comme
$my_folder
ci-dessous.
Les variables...
$my_folder = 'http://localhost/mytest/go/';
$blog_url = 'http://localhost/mytest';
Et le contenu...
<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>
Le résultat final, après le remplacement doit être...
<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>
Avis que le premier lien n'est pas altérée, depuis sa un lien interne.
Le lien sur la deuxième ligne est également un lien interne, mais depuis qu'il correspond à notre $my_folder
chaîne, il obtient le nofollow
trop.
Le troisième lien est le plus facile, car il ne correspond pas à la blog_url
son évidence d'un lien externe.
Toutefois, dans le script ci-dessous, TOUS mes liens sont arriver nofollow
. Comment puis-je corriger le script pour faire ce que je veux?
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 .= ' >';
$content["post_content"] = str_replace($matches[0][$i], $result, $content["post_content"]);
}
}
return $content;
}
source d'informationauteur Scott B
Vous devez vous connecter pour publier un commentaire.
Essayer de le rendre plus lisible d'abord, et ensuite seulement faire de votre
if
des règles plus complexes:Donne la sortie suivante:
Le problème dans votre code original aurait été $rseo qui n'était pas déclaré, n'importe où.
Ici est le DOMDocument solution...
De sortie
Essayer celui-ci (PHP 5.3+):
et code:
Exemples:
L'aide d'expressions régulières pour faire ce travail correctement serait assez compliqué. Il serait plus facile d'utiliser un véritable analyseur, comme celui de la DOM extension. DOM n'est pas très débutant-friendly, donc ce que vous pouvez faire est de charger le HTML avec DOM ensuite exécuter les modifications avec SimpleXML. Ils sont complétés par la même bibliothèque, de sorte qu'il est facile à utiliser l'un avec l'autre.
Voici à quoi il peut ressembler à:
Comme vous pouvez le voir, c'est vraiment court et simple. Selon vos besoins, vous pouvez utiliser
preg_match()
en place de lastrpos()
trucs pour exemple:Remarque
J'ai raté le dernier bloc de code dans l'OP quand j'ai lu la question. Le code que j'ai posté (et à peu près toute solution basée sur les DOM) est mieux adapté au traitement d'une page entière plutôt que d'un bloc HTML. Sinon, DOM va tenter de "réparer" votre code HTML et peut ajouter une
<body>
balise DOCTYPE, etc...