phpcms V9 内联/关联链接 字符串较长链接无法正确替换的问题完美解决

针对phpcms V9中内联/关联链接字符串过长导致的替换错误,本文提供了解决方案。通过修改扩展函数文件库中的_keylinks()方法,增加中间变量进行两次替换,确保关键词的正确处理,有效避免了内联嵌套引发的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.taisha.org/index.php?m=content&siteid=1&a=show&catid=27&id=45104

样板地址 

修改phpcms扩展函数文件库,/phpcms/libs/functions/extention.func.php新增函数cmp

function cmp($a,$b){

            	if(is_array($a)||is_array($b)){
                	if ($a[0] == $b[0]){return 0;}else{return ((strlen($a[0]))<(strlen($b[0]))) ? 1 : -1;}
          	    }else{
            		if ($a == $b){return 0;}else{return ((strlen($a))<(strlen($b))) ? 1 : -1;}
            	}
}
修改文件为/phpcms/modules/content/fields/editor/output.inc.php

修改方法为_keylinks()

修改代码如下

	function _keylinks($txt, $replacenum = '',$link_mode = 1) {
		$search = "/(alt\s*=\s*|title\s*=\s*)[\"|\'](.+?)[\"|\']/is";
		$txt = preg_replace_callback($search, array($this, '_base64_encode'), $txt);
		$keywords = $this->data['keywords'];
		if($keywords) $keywords = strpos(',',$keywords) === false ? explode(' ',$keywords) : explode(',',$keywords);
		if($link_mode && !empty($keywords)) {
			foreach($keywords as $keyword) {
				$linkdatas[] = $keyword;
			}
		} else {
			$linkdatas = getcache('keylink','commons');
		}
		if($linkdatas) {
			usort($linkdatas , "cmp");
			$word = $replacement = array();
			foreach($linkdatas as $k=>$v) {
				if($link_mode && $keywords) {
					$word1[] = '/(?!(<a.*?))' . preg_quote($v, '/') . '(?!.*<\/a>)/s';
					$word2[] = $v;
					$midd1[] = "@$k@";
                    $midd2[] = "/@$k@/";
					$replacement[] = '<a href="javascript:;" onclick="show_ajax(this)" class="keylink">'.$v.'</a>';
				} else {
					$word1[] = '/(?!(<a.*?))' . preg_quote($v[0], '/') . '(?!.*<\/a>)/s';
					$word2[] = $v[0];
					$midd1[] = "@$k@";
                    $midd2[] = "@$k@";
					$replacement[] = '<a href="'.$v[1].'" target="_blank" class="keylink">'.$v[0].'</a>';
				}
			}
			if($replacenum != '') {
                $txt = preg_replace($word1, $midd1, $txt, $replacenum);
				$txt = preg_replace($midd2, $replacement, $txt, $replacenum);
			} else {
                $txt = str_replace($word2, $midd1, $txt);
				$txt = str_replace($midd2, $replacement, $txt);
			}
		}
		$txt = preg_replace_callback($search, array($this, '_base64_decode'), $txt);
		return $txt;
	}


修改思路如下 :首先对关键词进行排序 ,使用usort函数采用自定义函数排序,关键词长的放前面

其次循环关键词组时增加 foreach($linkdatas as $k=>$v) 增加$k最为正则替换中间变量

最后 增加中间变量 modd1 modd2 分两次替换关键词语


在代码中 理论上只需要排序即可,不需要使用中间变量进行处理,但是为了必变避免内联嵌套,所以使用了中间变量完全避免关键词的相关性


如上,解决



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值