我的应用程序允许用户在我的网站上发表评论。它的工作正常。我也有工具在其中插入他们的网页链接。内容与他们自己的网络链接我感觉很好。
现在我想将rel =“nofollow”添加到已写入内容的每个链接上。
我想在保存数据的同时使用php添加rel =“nofollow”。
那么使用php添加rel =“nofollow”或使用rel =“someother nofollow”更新rel =“someother”的简单方法
一个很好的例子将是非常有效的
答案 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());
生成的HTML位于$dom->saveHTML()
。除了它将用html
,body
元素等包装它,所以使用它来提取你输入的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;