侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

浅析PHP关键词替换的类(避免重复替换,保留与还原原始链接)

php  /  管理员 发布于 7年前   167

php关键词替换的类(避免重复替换,保留与还原原始链接)

本节主要内容:

一个关键词替换的类

主要可以用于关键词过滤,或关键词查找替换方面。

实现过程分析:

关键词替换,其实就是一个str_replace()的过程,如果是单纯的str_replace面对10W的关键词,1W字的文章也只需要2秒左右。

问题所在:

关键词替换了不只一次,比如a需要替换成a,但结果可能是a等这样。

为此,需要一个方法保护好已经替换了的标签,那么在处理文章之前,就先把标签替换掉比如[_tnum_]在文章处理好了以后再把它还原。

另外一个问题,如果关键字或文章中有[_tnum_]本身怎么办,那么就需要排除这种这里就不能使用str_replace了而需要用到preg_replace用正则来排除。

第三个问题,如果有两个关键字a和ab怎么办,希望先把长的匹配掉,短后匹配,这样就需要在匹配前先排序。

最后一个问题,当str_replace改成了preg_replace以后,变慢了同样一段话10W次匹配要5秒钟,字符串处理的函数中strpos要快一些,那么先用strpos找出关键词即可,10W次查询还不到1秒。就算是100万才道8秒多。

一个关键词匹配替换的类,代码:

代码示例:

  * @packet mipang  * 使用实例  * $str = "绿壳蛋鸡撒范德萨下一年,下一年的洒落开房间卢卡斯地方军";  * $key = new KeyReplace($str,array("xxxx"=>"sadf","下一年"=>'http://baidu.com',"下一年"=>'google.com'));  * echo $key->getResultText();  * echo $key->getRuntime();  */class KeyReplace{ private $keys = array(); private $text = ""; private $runtime = ; private $url = true; private $stopkeys = array(); private $all = false; /**  * @access public    * @param string $text 指定被处理的文章  * @param array $keys 指定字典词组array(key=>url,...) url可以是数组,如果是数组将随机替换其中的一个  * @param array $stopkeys 指定停止词array(key,...) 这里面的词将不会被处理  * @param boolean $url true 表示替换成链接否则只替换  * @param boolean $all true 表示替换所有找到的词,否则只替换第一次  */ public function __construct($text='',$keys=array(),$url=true,$stopkeys=array(),$all=false) {  $this->keys = $keys;  $this->text = $text;  $this->url = $url;  $this->stopkeys = $stopkeys;  $this->all = $all; } /**  * 获取处理好的文章  * @access public    * @return string text  */ public function getResultText() {  $start = microtime(true);  $keys = $this->hits_keys();  $keys_tmp = array_keys()($keys);  function cmp($a, $b){   if (mb_strlen($a) == mb_strlen($b)) { return ;   }   return (mb_strlen($a) < mb_strlen($b)) ? : -;  }  usort($keys_tmp,"cmp");  foreach($keys_tmp as $key){   if(is_array($keys[$key])){ $url = $keys[$key][rand(,count($keys[$key])-)];   }else $url = $keys[$key];   $this->text = $this->r_s($this->text,$key,$url);  }  $this->runtime = microtime(true)-$start;  return $this->text; } /**  * 获取处理时间  * @access public    * @return float   */ public function getRuntime() {  return $this->runtime; } /**  * 设置关键词  * @access public    * @param array $keys array(key=>url,...)  */ public function setKeys($keys) {  $this->keys = $keys; } /**  * 设置停止词  * @access public    * @param array $keys array(key,...)  */ public function setStopKeys($keys) {  $this->stopkeys = $keys; } /**  * 设置文章  * @access public    * @param string $text   */ public function setText($text) {  $this->text = $text; } /**  * 用来找到字符串里面命中的关键词  * @access public  * @return array $keys 返回匹配到的词array(key=>url,...)  */ public function hits_keys(){  $ar = $this->keys;  $ar = $ar?$ar:array();  $result=array();  $str = $this->text;  foreach($ar as $k=>$url){   $k = trim($k);   if(!$k) continue;   if(strpos($str,$k)!==false && !in_array($k,$this->stopkeys)){ $result[$k] = $url;   }  }  return $result?$result:array(); } /**  * 用来找到字符串里面命中的停止词  * @access public  * @return array $keys 返回匹配到的词array(key,...)  */ public function hits_stop_keys(){  $ar = $this->stopkeys;  $ar = $ar?$ar:array();  $result=array();  $str = $this->text;  foreach($ar as $k){   $k = trim($k);   if(!$k) continue;   if(strpos($str,$k)!==false && in_array($k,$this->stopkeys)){ $result[] = $k;   }  }  return $result?$result:array(); } /**  * 处理替换过程   * @access private  * @param string $text 被替换者  * @param string $key 关键词  * @param string $url 链接  * @return string $text 处理好的文章  */ private function r_s($text,$key,$url){  $tmp = $text;  $stop_keys = $this->hits_stop_keys();  $stopkeys = $tags = $a = array();  if(preg_match_all("#]+>[^<]*]*>#su",$tmp,$m)){   $a=$m[];   foreach($m[] as $k=>$z){ $z = preg_replace("#\##s","\#",$z); $tmp = preg_replace('#'.$z.'#s',"[_a".$k."_]",$tmp,);   }  };  if(preg_match_all("#<[^>]+>#s",$tmp,$m)){   $tags = $m[];   foreach($m[] as $k=>$z){ $z = preg_replace("#\##s","\#",$z); $tmp = preg_replace('#'.$z.'#s',"[_tag".$k."_]",$tmp,);   }  }  if(!empty($stop_keys)){   if(preg_match_all("#".implode("|",$stop_keys)."#s",$tmp,$m)){ $stopkeys = $m[]; foreach($m[] as $k=>$z){  $z = preg_replace("#\##s","\#",$z);  $tmp = preg_replace('#'.$z.'#s',"[_s".$k."_]",$tmp,); }   }  }  $key = preg_replace("#([\#\(\)\[\]\*])#s","\\\\$",$key);  if($this->url)   $tmp = preg_replace("#(?!\[_s|\[_a|\[_|\[_t|\[_ta|\[_tag)".$key."(?!ag\d+_\]|g\d+_\]|\d+_\]|s\d+_\]|_\])#us",''.$key.'',$tmp,$this->all?-:);  else   $tmp = preg_replace("#(?!\[_s|\[_a|\[_|\[_t|\[_ta|\[_tag)".$key."(?!ag\d+_\]|g\d+_\]|\d+_\]|s\d+_\]|_\])#us",$url,$tmp,$this->all?-:);  if(!empty($a)){   foreach($a as $n=>$at){ $tmp = str_replace("[_a".$n."_]",$at,$tmp);   }    }    if(!empty($tags)){   foreach($tags as $n=>$at){ $tmp = str_replace("[_tag".$n."_]",$at,$tmp);   }    }    if(!empty($stopkeys)){   foreach($stopkeys as $n=>$at){ $tmp = str_replace("[_s".$n."_]",$at,$tmp);   }    }    return $tmp; }}

以上就是本文给大家介绍的PHP关键词替换的类(避免重复替换,保留与还原原始链接)。

您可能感兴趣的文章:

  • php preg_match_all结合str_replace替换内容中所有img
  • PHP 替换模板变量实现步骤
  • PHP html标签正则替换并可自定义正则规则
  • php获取当前网址url并替换参数或网址的方法
  • PHP的substr_replace将指定两位置之间的字符替换为*号
  • PHP 字符串正则替换函数preg_replace使用说明
  • php 字符串替换的方法
  • PHP中替换换行符的几种方法小结
  • 如何在PHP中使用正则表达式进行查找替换
  • php 批量替换程序的具体实现代码
  • php 批量替换html标签的实例代码
  • PHP preg_replace() 正则替换所有符合条件的字符串
  • PHP正则表达式替换站点关键字链接后空白的解决方法
  • PHP正则替换函数preg_replace和preg_replace_callback使用总结
  • php正则替换变量指定字符的方法
  • php关键字仅替换一次的实现函数


  • 上一条:
    PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
    下一条:
    PHP实现搜索相似图片
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • PHP 8.4 Alpha 1现已发布!(0个评论)
    • 用Time Warden监控PHP中的代码处理时间(0个评论)
    • 在PHP中使用array_pop + yield实现读取超大型目录功能示例(0个评论)
    • Property Hooks RFC在PHP 8.4中越来越接近现实(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-11
    • 2017-12
    • 2018-01
    • 2018-02
    • 2018-03
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-09
    • 2021-02
    • 2021-03
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    • 2024-05
    • 2024-06
    • 2024-07
    • 2024-09
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客