php正则匹配字符串URL并替换为超链接,只替换一次,略过a标签。实现通篇文章只替换最先出现的关键字一次。
class HotLinkController
{
protected $_content;
protected $_keywords;
public function __construct($content,$keywords)
{
$this->setContent($content);
$this->setKeywords($keywords);
}
/**
* 加链接
*/
public function addHotLink(){
$content=$this->getContent();
$kWordArr=$this->keyWordSort($this->getKeywords());
$htmlTagArr=$this->getAllHtmlTag($content);
$noHtmlContentArr=$this->splitContentByTag($content);
$tempReplaceHtmlTag='{'.md5('lvdora-news').'}';
$tempReplaceArray = array();
$temContent=implode($tempReplaceHtmlTag,$noHtmlContentArr);
$data = $content;
foreach($kWordArr as $k=>$v) {
$quote = str_replace(array("'", '-'), array("\'", '\-'), preg_quote($v[0]));
$data = preg_replace('\'(?!((<.*?)|(<a.*?)|(<strong.*?)))('.$quote.')(?!(([^<>]*?)>)|([^>]*?</a>)|([^>]*?</strong>))\'si', '<a href="'.$v[1].'" target="_blank">'.$v[0].'</a>', $data, 1);//数字1代表在正则中出现的替换频率
if($data == '') $data = $content;
}
return $data;
}
/**
* 根据html标签切割内容
*
* @param string $content
* @return array
*/
public function splitContentByTag($content) {
return preg_split('/<a[^>]*>.*?<\/a>|<\/?[a-zA-Z]+[^>]*>/', $content);
}
/**
* 提取出所有html标签
*
* @param string $content
* @return array
*/
public function getAllHtmlTag($content) {
preg_match_all('/<a[^>]*>.*?<\/a>|<\/?[a-zA-Z]+[^>]*>/', $content, $match);
if (isset($match[0])) {
$htmlTagArray = $match[0];
return $htmlTagArray;
}
return array();
}
/**
* 对关键词进行排序,最长的排前面
* @param array $keyWordsArr
* @return array $keyWordsArr
*/
protected function keyWordSort($keyWordsArr) {
usort($keyWordsArr, function($a, $b) {
$al = strlen($a[0]);
$bl = strlen($b[0]);
if ($al == $bl)
return 0;
return ($al > $bl) ? -1 : 1;
});
return $keyWordsArr;
}
/**
* 设置内容
* @param $content 内容
*/
protected function setContent($content){
$this->_content=$content;
}
/**
* 获取内容
* @return mixed
*/
protected function getContent(){
return $this->_content;
}
/**
* 设置关键词
* @param $keyWords 关键词
*/
protected function setKeywords($keyWords){
$this->_keywords=$keyWords;
}
/**
* 获取关键词
* @return mixed
*/
protected function getKeywords(){
return $this->_keywords;
}
}
/**
* 实例化核心类,需传入两个参数
* $content:需要加链接的文章内容
* $keywords:二维数组,包含链接的关键词,链接地址,替换次数,格式如下
* array(
* array('关键词','链接地址','替换次数')
* array('关键词','链接地址','替换次数')
* ...
* )
*/
$content = '<p>
云顶之弈S4赛季在测试服中正式实装已经过去一个星期,可以说游戏内部所有的羁绊都已经被得到测试服机会的玩家们所吃透了。而在本次S4命运之轮版本中,强力的五星单卡也都获得了自己的专属羁绊比如说腕豪的专属羁绊霸王,快来一起看看吧。搜<span style="text-indent: 32px;">一搜手游网提供最新版</span><a href="http://www.sys321.com/shouyou/205574.html" target="_blank" style="white-space: normal; text-indent: 32px;">云顶之弈手游下载</a><span style="text-indent: 32px;">,玩家们千万不要错过哦!</span>
</p>
<p>
<strong>云顶之弈S4霸王羁绊强不强?霸王羁绊有哪些英雄?</strong>
</p>
<p>
霸王是5费卡腕豪专属羁绊,读着就很搞笑的一个羁绊 <a href="hha.com">王者</a>,王者濒死的时候王者王者荣耀1荣耀会出去做仰卧起坐,回完王者血再回到场上,而且还能增加攻速,如果仰卧起坐直接坐满血了,还能造成额外真实伤害,直到场上单位都死光了。
</p>
<p style="text-align: center;">
<img src="//img.sys321.com/20200907/eb8644ba117284a22badd7139efec402.jpg" title="云顶之弈S4王者荣耀霸王羁绊效果" alt="云顶之弈S4霸王羁绊效果" width="605" height="155" style="width: 605px; height: 155px;"/>
</p>
<p>
怎么样像不像对面上单ctrl2做仰卧起坐嘲讽你,然后你用锐雯生气的一套w闪qaqaqaer引燃,打掉腕豪四分之三的血,腕豪反手一个rw把你秒了,打字:“精彩!”
</p>
<p>
云顶里的腕豪有着制裁加里奥等前排的能力,不需要输出装,只需要肉装,是个不错的单卡,啥阵容9人口都能外挂一张,算是一张万能对策卡,
适合很多阵容单挂。
</p>
<p style="text-align: center;">
<img src="//img.sys321.com/20200907/94e524a9b6fa630a20ca9c2a834d8048.jpg" title="云顶之弈S4霸王羁绊是腕豪英雄专属羁绊" alt="云顶之弈S4霸王羁绊是腕豪英雄专属羁绊" width="605" height="375" style="width: 605px; height: 375px;"/>
</p>
<p>
如果在<a href="http://www.sys321.com/zhuanti/pvp_jingjiduizhan_shouyou.html" target="_blank" style="white-space: normal;">PVP竞技对王者荣耀12战游戏</a>被动触发血线之前把他秒了王者荣耀12会触发锁血,也就是羁绊效果是一定会触发的。
</p>';
$keywords = [
['王者','baidu.com','1'],
['王者荣耀','google.com','1'],
['王者荣耀1','google.com','1'],
['王者荣耀12','google.com','1'],
];
$hotLink=new HotLinkController($content,$keywords);
//调用添加关键词链接方法
$content=$hotLink->addHotLink();
echo $content;