尝试用一些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
相关并且对链接没有影响。
大卫