如何在链接为Nofollow时替换标记之间的代码

时间:2014-11-15 02:23:12

标签: php regex preg-replace preg-match

尝试用一些HTML代码替换nofollow文本和图像链接(将nofollow链接转换为CSS / javascript链接),暂时使用preg_match和preg_replace,但在今天早些时候的某些情况下意识到它失败了。

我的PHP基本代码(它比这更复杂,我在底部使用粘贴的内容)但这是核心代码,add_filter部分是特定于WordPress的:

add_filter('the_content', 'st_nofollow_content', 99);

function st_nofollow_content($content) {
$content = preg_replace('/<a href="(.*?)" rel="nofollow">(.*?)<\/a>/i', '<span class="affst" title="tests" id="$1">$2</span>', $content);
return $content;
}

这是简化版本,我使用的代码试图考虑下面描述的问题,但它并不适用于所有情况,因此它并不理想。

只要只有一个链接或所有链接都包含rel =&#34; nofollow&#34;。

如果没有rel =&#34; nofollow&#34;属性后跟一个链接,其中包含rel =&#34; nofollow&#34;这两个链接合并在一起。

<a href="url-one">anchor one</a> blah, blah... <a href="url-two" rel="nofollow">anchor two</a>

输出

<span class="affst" title="tests" id="url-one">anchor one</a> blah, blah... <a href="url-two">anchor-two</span>

输出应为:

<a href="url-one">anchor one</a> blah, blah... <span class="affst" title="tests" id="url-two">anchor two</span>

我理解这个问题,但不确定是否存在preg_replace解决方案?

此代码是我一直在使用和使用的代码,而不是在有和没有nofollow的链接混合的情况下:

if (preg_match('/<a href="(.*?)<\/a>(.*?)<a href="(.*?)" rel="nofollow">(.*?)<\/a>/i', $content)) {
$content = preg_replace('/<a href="(.*?)<\/a>(.*?)<a href="(.*?)" rel="nofollow">(.*?)<\/a>/i', '<a href="$1</a>$2<span class="affst" title="tests" id="$3">$4</span>', $content);
} else {
$content = preg_replace('/<a href="(.*?)" rel="nofollow">(.*?)<\/a>/i', '<span class="affst" title="tests" id="$1">$2</span>', $content);
}

在这一天花了半天时间,如果我理解正确,则上述类型的代码无法使用。

我的方法应该是什么,只想在

时替换代码

第一个开头(a)标签:url:rel =&#34; nofollow&#34; :关闭(/ a)与第一个打开标签相关联的标签?

由于

大卫

编辑:看起来我应该使用我并不熟悉的DOM。到目前为止:

function st_nofollow_content($content){
$dom = new DOMDocument();
$dom->loadHTML( $content );
$dom->preserveWhiteSpace = false;

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

foreach ($alinks as $alink) {
$rel = $alink->getAttribute('rel');
if( $rel = 'nofollow') {
$alink = preg_replace('/<a href="(.*?)" rel="nofollow">(.*?)<\/a>/i', '<span class="affst" title="tests" id="$1">$2</span>', $alink);
}
}
$content = $dom->saveHTML();

return $content;
}

不起作用,抛出相当多的警告

DOMDocument :: loadHTML():意外的结束标记:实体中的div:与$ dom-&gt; loadHTML相关...行

类DOMElement的对象无法转换为字符串:与$ alink = preg_replace .... line

相关

并且对链接没有影响。

大卫

0 个答案:

没有答案