~~~
/**
* 文章內鏈替換
* 替換規則:數組靠前的權重大
* @param string $content 文章內容
* @param array $links 內鏈詞數組[$word=>$link],權重高的在前面,此參數不寫為還原內鏈
* @return string 返回替換后的內容
*/
public static function innerLink($content, $links = array())
{
//還原內鏈
$content = preg_replace('/<a class=\"epwk_inner_link\"[^>]+>([^<]+)<\/a>/', '$1', $content);
//內鏈替換
if (is_array($links) && !empty($links)) {
//匿名函數,相同關鍵字僅替換一次
$func_replace_once = function ($search, $replace, $subject, &$isReplaced) {
$pos = strpos($subject, $search);
if ($pos === false) {
$isReplaced = false;
return $subject;
} else {
$isReplaced = true;
return substr_replace($subject, $replace, $pos, strlen($search));
}
};
//最終替換的數組
$finalReplace = array();
//已經替換過的鏈接數組
$exsist = array();
//非HTML匹配規則
$reg = '/(?:<[^>]*>)?([^<]*)(?:<[^>]*>)?/';
//正則匹配替換
$content = preg_replace_callback($reg, function ($matches) use ($links, &$exsist, $func_replace_once, &$finalReplace) {
if (trim($matches[1])) {
$tmp = $matches[1];
foreach ($links as $word => $link) {
if (!in_array($link, $exsist)) {
$isReplaced = false;
$replaceStr = '<a class="epwk_inner_link" href="' . $link . '" target="_blank">' . $word . '</a>';
$replaceStrMd5 = '[' . md5($replaceStr) . ']';
$tmp = $func_replace_once($word, $replaceStrMd5, $tmp, $isReplaced);
if ($isReplaced) {
$exsist[] = $link;
$finalReplace[$replaceStrMd5] = $replaceStr;
}
}
}
return str_replace($matches[1], $tmp, $matches[0]);
}
return $matches[0];
}, $content);
//進行最終的替換
if ($finalReplace) {
$keys = $vals = array();
foreach ($finalReplace as $k => $v) {
$keys[] = $k;
$vals[] = $v;
}
$content = str_replace($keys, $vals, $content);
}
}
return $content;
}
~~~