当前位置:Gxlcms > PHP教程 > substr_replace替换问题

substr_replace替换问题

时间:2021-07-01 10:21:17 帮助过:18人阅读

写了一个小程序,想把网站文章中出现的关键词自动加链接,并且当关键词出现多次时只替换一次,与是用到了strpos()及substr_replace实现了此功能,代码如下:
function keywords_autolink($content) {    $keywords=array(            '企业管理书籍' => '企业管理书籍',            '企业管理' => '企业管理书籍',            '管理学书籍' => '管理学书籍',            '管理书籍' => '管理书籍',            '管理类书籍' => '管理类书籍',            '市场营销' => '市场营销',            '职场' => '职场' );     $keys=array_keys($keywords);    foreach ($keys as $k) {      $pos=strpos($content, $k);      if ($pos !== false) {        // Nothing found        $length=strlen($k);        $content=substr_replace($content, $keywords[$k], $pos, $length);        //$content是文章内容,$keywords[$k]需要替换成的内容,$pos替换开始的位置,$length数出要从开始的位置算起要替换的词有多长。        unset($k);//最后销毁一下哦。    }    }          return $content;  }add_filter('the_content', 'keywords_autolink');


但现在的一个问题是,当同时出现两个需要替换的词时就会乱套,比如,企业管理书籍和企业管理同时出现了,即“企业管理书籍企业管理'”,那么这时候替换结果就成了:
企业管理书籍" target="_blank">企业管理书籍



请问这种问题如何解决呀?大概知道用排序法什么的,可是不太懂,还望前辈们指点下,谢谢了!


回复讨论(解决方案)

function keywords_autolink($content) {    $keywords=array(            '企业管理书籍' => '企业管理书籍',            '企业管理' => '企业管理书籍',            '管理学书籍' => '管理学书籍',            '管理书籍' => '管理书籍',            '管理类书籍' => '管理类书籍',            '市场营销' => '市场营销',            '职场' => '职场'	);	/*    $keys=array_keys($keywords);    foreach ($keys as $k) {      $pos=strpos($content, $k);      if ($pos !== false) {			// Nothing found			$length=strlen($k);			$content=substr_replace($content, $keywords[$k], $pos, $length);			//$content是文章内容,$keywords[$k]需要替换成的内容,$pos替换开始的位置,$length数出要从开始的位置算起要替换的词有多长。			unset($k);//最后销毁一下哦。	 		}    } 	*/	$keys = array_keys($keywords);	$tmpReplace = [];	foreach($keys as $k=>$v){		$tmpReplace[] = $tmp = '['.$k.']';	}	$content = str_replace($keys,$tmpReplace,$content);	$content = str_replace($tmpReplace,array_values($keywords),$content);		return $content;   }echo keywords_autolink('企业管理书籍哈哈企业管理呵呵企业管理');

function keywords_autolink($content) {    $keywords=array(            '企业管理书籍' => '企业管理书籍',            '企业管理' => '企业管理书籍',            '管理学书籍' => '管理学书籍',            '管理书籍' => '管理书籍',            '管理类书籍' => '管理类书籍',            '市场营销' => '市场营销',            '职场' => '职场'	);	/*    $keys=array_keys($keywords);    foreach ($keys as $k) {      $pos=strpos($content, $k);      if ($pos !== false) {			// Nothing found			$length=strlen($k);			$content=substr_replace($content, $keywords[$k], $pos, $length);			//$content是文章内容,$keywords[$k]需要替换成的内容,$pos替换开始的位置,$length数出要从开始的位置算起要替换的词有多长。			unset($k);//最后销毁一下哦。	 		}    } 	*/	$keys = array_keys($keywords);	$tmpReplace = [];	foreach($keys as $k=>$v){		$tmpReplace[] = $tmp = '['.$k.']';	}	$content = str_replace($keys,$tmpReplace,$content);	$content = str_replace($tmpReplace,array_values($keywords),$content);		return $content;   }echo keywords_autolink('企业管理书籍哈哈企业管理呵呵企业管理');



谢谢,但这个不行啊,会多次替换。

function keywords_autolink($content) {    $keywords=array(            '企业管理书籍' => '企业管理书籍',            '企业管理' => '企业管理书籍',            '管理学书籍' => '管理学书籍',            '管理书籍' => '管理书籍',            '管理类书籍' => '管理类书籍',            '市场营销' => '市场营销',            '职场' => '职场'	);	/*    $keys=array_keys($keywords);    foreach ($keys as $k) {      $pos=strpos($content, $k);      if ($pos !== false) {			// Nothing found			$length=strlen($k);			$content=substr_replace($content, $keywords[$k], $pos, $length);			//$content是文章内容,$keywords[$k]需要替换成的内容,$pos替换开始的位置,$length数出要从开始的位置算起要替换的词有多长。			unset($k);//最后销毁一下哦。	 		}    } 	*/	$keys = array_keys($keywords);	$tmpReplace = [];	foreach($keys as $k=>$v){		$tmpReplace[] = $tmp = '['.$k.']';		$tmpfind = '/'.$v.'/';		$content = preg_replace($tmpfind,$tmp,$content,1);	}		$content = str_replace($tmpReplace,array_values($keywords),$content);        	return $content;   }echo keywords_autolink('企业管理书籍哈哈企业管理呵呵企业管理');

谢谢,上面是替换了一次,但企业管理书籍被替换了多次,并且企业管理没有被替换。

看看你的$keywords
第一个 企业管理书籍 替换为 带连接的企业管理书籍
第一个 企业管理 也替换为 带连接的企业管理书籍
第二个 企业管理 没有替换

怎么不对了

看看你的$keywords
第一个 企业管理书籍 替换为 带连接的企业管理书籍
第一个 企业管理 也替换为 带连接的企业管理书籍
第二个 企业管理 没有替换

怎么不对了



我看错了,代码正常,谢谢,本贴已结,可不可以再看看这个 http://bbs.csdn.net/topics/391942890

人气教程排行