首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保存数据时添加rel="nofollow“

保存数据时添加rel="nofollow“
EN

Stack Overflow用户
提问于 2011-05-01 20:04:13
回答 2查看 2.2K关注 0票数 5

我有我的应用程序,允许用户在我的网站上写评论。它工作得很好。我也有工具来插入他们的网页链接在里面。我觉得有自己的网页链接的内容很好。

现在,我想将rel="nofollow“添加到它们已经编写的内容的每个链接中。

我想添加rel="nofollow“使用php,即在保存数据时。

那么,使用php添加rel="nofollow“或使用rel=”So“更新rel="someother”有什么简单方法呢?

一个很好的例子将会非常有效。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-01 20:14:56

正则表达式确实不是处理HTML的最佳工具,尤其是在PHP内置了非常好的HTML解析器的情况下。

如果rel属性已经填充,则此代码将处理添加nofollow

代码语言:javascript
复制
$dom = new DOMDocument;

$dom->loadHTML($str);

$anchors = $dom->getElementsByTagName('a');

foreach($anchors as $anchor) { 
    $rel = array(); 

    if ($anchor->hasAttribute('rel') AND ($relAtt = $anchor->getAttribute('rel')) !== '') {
       $rel = preg_split('/\s+/', trim($relAtt));
    }

    if (in_array('nofollow', $rel)) {
      continue;
    }

    $rel[] = 'nofollow';
    $anchor->setAttribute('rel', implode(' ', $rel));
}

var_dump($dom->saveHTML());

CodePad

生成的超文本标记语言是$dom->saveHTML()格式的。除了它将用htmlbody元素等包装它之外,所以使用它只提取您输入的HTML...

代码语言:javascript
复制
$html = '';

foreach($dom->getElementsByTagName('body')->item(0)->childNodes as $element) {
    $html .= $dom->saveXML($element, LIBXML_NOEMPTYTAG);
}

echo $html;

如果您使用的是>= PHP5.3,请将saveXML()替换为saveHTML()并删除第二个参数。

示例

这个HTML..。

代码语言:javascript
复制
<a href="">hello</a>

<a href="" rel="">hello</a>

<a href="" rel="hello there">hello</a>

<a href="" rel="nofollow">hello</a>

...is已转换为...

代码语言:javascript
复制
<a href="" rel="nofollow">hello</a>

<a href="" rel="nofollow">hello</a>

<a href="" rel="hello there nofollow">hello</a>

<a href="" rel="nofollow">hello</a>
票数 18
EN

Stack Overflow用户

发布于 2016-01-15 18:47:50

我复制了Alex's answer,并将其添加到一个函数中,使链接不会跟随并在新的选项卡/窗口中打开(并添加了对UTF8的支持)。我不确定这是否是最好的方法,但它是有效的(欢迎建设性的意见):

代码语言:javascript
复制
function nofollow_new_window($str)
{
$dom = new DOMDocument;

$dom->loadHTML($str);

$anchors = $dom->getElementsByTagName('a');

foreach($anchors as $anchor)
    { 
    $rel = array(); 

    if ($anchor->hasAttribute('rel') AND ($relAtt = $anchor->getAttribute('rel')) !== '') {
       $rel = preg_split('/\s+/', trim($relAtt));
        }

    if (in_array('nofollow', $rel)) {
      continue;
        }

    $rel[] = 'nofollow';
    $anchor->setAttribute('rel', implode(' ', $rel));

    $target = array(); 

    if ($anchor->hasAttribute('target') AND ($relAtt = $anchor->getAttribute('target')) !== '') {
       $target = preg_split('/\s+/', trim($relAtt));
        }

    if (in_array('_blank', $target)) {
      continue;
        }

    $target[] = '_blank';
    $anchor->setAttribute('target', implode(' ', $target));
    }

$str = utf8_decode($dom->saveHTML($dom->documentElement));
return $str;
}

只需使用如下所示的函数:

代码语言:javascript
复制
$str = '<html><head></head><body>fdsafffffdfsfdffff dfsdaff flkklfd aldsfklffdssfdfds <a href="http://www.google.com">Google</a></body></html>';

$str = nofollow_new_window($str);

echo $str;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5848217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档