PHP实现的字符串匹配算法示例【sunday算法】


Posted in PHP onDecember 19, 2017

本文实例讲述了PHP实现的字符串匹配算法————sunday算法。分享给大家供大家参考,具体如下:

Sunday算法是Daniel M.Sunday于1990年提出的字符串模式匹配。其核心思想是:在匹配过程中,模式串发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。

<?php
/*
 *@param $pattern 模式串
 *@param $text 待匹配串
 */
function mySunday($pattern = '',$text = ''){
  if(!$pattern || !$text) return false;
  $pattern_len = mb_strlen($pattern);
  $text_len = mb_strlen($text);
  if($pattern_len >= $text_len) return false;
  $i = 0;
  for($i = 0; $i < $pattern_len; $i++){ //组装以pattern中的字符为下标的数组
    $shift[$pattern[$i]] = $pattern_len - $i;
  }
  while($i <= $text_len - $pattern_len){
    $nums = 0;   //匹配上的字符个数
    while($pattern[$nums] == $text[$i + $nums]){
      $nums++;
      if($nums == $pattern_len){
        return "The first match index is $i\n";
      }
    }
    if($i + $pattern_len < $text_len && isset($shift[$text[$i + $pattern_len]])){ //判断模式串后一位字符是否在模式串中
      $i += $shift[$text[$i + $pattern_len]];   //对齐该字符
    }else{
      $i += $pattern_len;   //直接滑动pattern_len位
    }
  }
}
$text = "I am testing mySunday on sunday!";
$pattern = "sunday";
echo mySunday($pattern,$text);

运行结果:

The first match index is 25

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
基于qmail的完整WEBMAIL解决方案安装详解
Oct 09 PHP
社区(php&amp;&amp;mysql)四
Oct 09 PHP
php更新mysql后获取影响的行数发生异常解决方法
Mar 28 PHP
PHP采用自定义函数实现遍历目录下所有文件的方法
Aug 19 PHP
ThinkPHP多语言支持与多模板支持概述
Aug 22 PHP
PHP遍历文件夹与文件类及处理类用法实例
Sep 23 PHP
php中strtotime函数用法详解
Nov 15 PHP
PHP中使用BigMap实例
Mar 30 PHP
php限制文件下载速度的代码
Oct 20 PHP
php防止CC攻击代码 php防止网页频繁刷新
Dec 21 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
Feb 05 PHP
PHP基于自定义类随机生成姓名的方法示例
Aug 05 PHP
PHP实现的折半查找算法示例
Dec 19 #PHP
php之header的不同用法总结(实例讲解)
Nov 28 #PHP
PHP中register_shutdown_function函数的基础介绍与用法详解
Nov 28 #PHP
PHP命令空间namespace及use的用法小结
Nov 27 #PHP
Laravel 批量更新多条数据的示例
Nov 27 #PHP
PHP开发实现微信退款功能示例
Nov 25 #PHP
PHP微信企业号开发之回调模式开启与用法示例
Nov 25 #PHP
You might like
PHP语言中global和$GLOBALS[]的分析 之二
2012/02/02 PHP
PHP引用(&amp;)各种使用方法实例详解
2014/03/20 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
PHP入门教程之自定义函数用法详解(创建,调用,变量,参数,返回值等)
2016/09/11 PHP
PHP数字前补0的自带函数sprintf 和number_format的用法(详解)
2017/02/06 PHP
PHP基于自定义类随机生成姓名的方法示例
2017/08/05 PHP
javascript Keycode对照表
2009/10/24 Javascript
js 自定义的联动下拉框
2010/02/07 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
js实现连个数字相加而不是拼接的方法
2014/02/23 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
2014/05/05 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
简单实现js选项卡切换效果
2016/02/03 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
js实现的万能flv网页播放器代码
2016/04/30 Javascript
jQuery中each()、find()和filter()等节点操作方法详解(推荐)
2016/05/25 Javascript
辨析JavaScript中的Undefined类型与null类型
2016/05/26 Javascript
详解nodejs 文本操作模块-fs模块(一)
2016/12/22 NodeJs
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
详解vue-router数据加载与缓存使用总结
2018/10/29 Javascript
详解vuex 渐进式教程实例代码
2018/11/27 Javascript
JS实现打砖块游戏
2020/02/14 Javascript
记一次vue跨域的解决
2020/10/21 Javascript
[03:36]DOTA2完美大师赛coL战队趣味视频——我演你猜
2017/11/23 DOTA
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
2015/04/28 Python
Python查询阿里巴巴关键字排名的方法
2015/07/08 Python
Python3中的列表,元组,字典,字符串相关知识小结
2017/11/10 Python
python  创建一个保留重复值的列表的补码
2018/10/15 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
css3 clip实现圆环进度条的示例代码
2018/02/07 HTML / CSS
人力资源部副职的竞聘演讲稿
2014/01/07 职场文书
我的中国梦演讲稿1000字
2014/08/19 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
2015年材料员工作总结
2015/04/30 职场文书
2015年酒店服务员工作总结
2015/05/18 职场文书
2016年植树节红领巾广播稿
2015/12/17 职场文书