保存数据时添加rel =“nofollow”

时间:2011-05-01 12:04:13

标签: php regex hyperlink

我的应用程序允许用户在我的网站上发表评论。它的工作正常。我也有工具在其中插入他们的网页链接。内容与他们自己的网络链接我感觉很好。

现在我想将rel =“nofollow”添加到已写入内容的每个链接上。

我想在保存数据的同时使用php添加rel =“nofollow”。

那么使用php添加rel =“nofollow”或使用rel =“someother nofollow”更新rel =“someother”的简单方法

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

3 个答案:

答案 0 :(得分:18)

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

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

$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

生成的HTML位于$dom->saveHTML()。除了它将用htmlbody元素等包装它,所以使用它来提取你输入的HTML ...

$html = '';

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

echo $html;

如果您有> = PHP 5.3,请将saveXML()替换为saveHTML()并删除第二个参数。

实施例

此HTML ...

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

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

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

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

...转换为......

<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>

答案 1 :(得分:2)

好Alex。如果它是一个函数的形式,它更有用。所以我在下面做了:


function add_no_follow($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));
  }

  $dom->saveHTML();

  $html = '';

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

  return $html;      
}

使用如下:

  $str = "Some content with link Some content  ... ";

 $str = add_no_follow($str);

答案 2 :(得分:0)

我复制了Alex's answer并将其变成了一个函数,它使链接nofollow并在新的选项卡/窗口中打开(并添加了UTF-8支持)。我不确定这是否是最好的方法,但是它有效(欢迎建设性的输入):

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;
}

只需使用以下功能:

$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;