引言

在项目开发中我们经常会遇到这样的需求,比如用户提交的表单中含有一些文本的内容。我们需要在后台为其进行关键词过滤处理。

那么问题来了,如何在海量的字符串中快速的匹配一些子字符串呢?今天我们就给大家讲解几种方法。

学习时间

这个需求的伪代码可以这样写。

$a = 'How are you?';if ($a contains 'are')echo 'true';

PHP 中推荐的做法是使用 strpos 函数,如果有匹配,则返回首次出现的位置,也就是 int 类型的值;如果没有,则返回 false。

$a = 'How are you?';if (strpos($a, 'are') !== false) {echo 'true';
}

注意判断是否匹配,使用了 !== false,判断完全不等于 false,则就算匹配了。因为首次出现的位置有可能是 0,而 0 == false 在逻辑运算上是成立的。所以要用严谨的绝对不等于。

为了通用,可以封装成通用的助手函数:

function contains($needle, $haystack)
{return strpos($haystack, $needle) !== false;
}

延伸学习

那么是不是一个 strpos 就够用了呢?显然不是,举例说明总是那么简单,现实情况却如此复杂。因为我们匹配的字符串,有可能是包含了各式各样编码后的字符串,如果做到通用?只有 PHP MbString 扩展了。

来看一个优秀案例,Laravel Str 类内的 contain 方法是如何实现的:

    public static function contains($haystack, $needles){foreach ((array) $needles as $needle) {if ($needle !== '' && mb_strpos($haystack, $needle) !== false) {return true;}}return false;}

大家看到了吧,核心函数使用了 mb_strpos 。

正则匹配

一般字符串操作,我们无需使用正则,因为太重量级了,没必要动用重型武器。但是strpos能做的,在正则匹配来说,是小菜一碟。

下面是 preg_match 的实现方式:

$a = 'How are you?';
$search = 'are y';
if(preg_match("/{$search}/i", $a)) {echo 'true';
}

这是一个粗略的用法,因为压根没考虑多字符编码形式对匹配结果的兼容。不过也算是一种解决方案吧。

写在最后

从优秀的案例中学习 PHP 函数的深度用法,可以大大提升我们的编程能力。抛开设计模式不说,PHP那些极为实用的函数,你真的都掌握了吗?

Happy coding :_)

我是 @程序员小助手 ,持续分享编程知识,欢迎关注。

php正则匹配域名不包含端口_3分钟短文 | PHP极速匹配子字符串,你是怎么做的?...相关推荐

  1. linux shell正则表达式如何匹配域名(包含中文域名)

    linux shell正则表达式如何匹配域名(包含中文) shell匹配域名 1. 匹配示例 2.使用差别 3.中文域名 4.为什么[\u4e00-\u9fa5]不能匹配中文(**想直接获取匹配包含中 ...

  2. linux绑定中文域名,linux shell正则表达式如何匹配域名(包含中文域名)

    linux shell正则表达式如何匹配域名(包含中文) shell匹配域名 1. 匹配示例 最近的项目需要校验一下域名格式匹配,百度一下,说明如下: DNS规定,域名中的标号都由英文字母和数字组成, ...

  3. html尾部代码_3分钟短文:Laravel Form,让你不再写 HTML 的好“库”

    引言 作为后端工程师的你,是不是面对一堆JS,CSS感觉无比抓狂.如果能摆脱大量的冗余的HTML代码块, 那该多好啊.laravel作为扩展性极强的框架,自然是为广大后端开发者赋能. 本文我们讲一个简 ...

  4. php 二维数组根据键值合并二维数组_3分钟短文 | PHP 根据值移除数组元素,哪个方法最简单?...

    引言 PHP 数组操作,之前我们讲了如何根据值,进行多维数组的排序.今天说一说,如何根据值,进行数组元素的删除. 学习时间 假设有一个一维数组,单纯的数字数组.为了简化问题,我们假设数组元素没有重复项 ...

  5. laravel $request 多维数组取值_3分钟短文 | Laravel 内3种数据校验的写法,你喜欢哪一个?...

    引言 web应用程序公开访问几乎没有不带用户交互的,难免要接收用户输入的奇奇怪怪的东西.对于后端程序,必须对输入的内容进行有效性过滤. 这就是本文的重点,说一说laravel中输入请求的校验. 学习时 ...

  6. 安卓应用用户数据_3分钟短文:Laravel应用跟用户打交道,就从拿到他们的数据开始!...

    引言 本来讲完路由和控制器,应该接着讲一讲视图的,但是鉴于视图的功能实在太枯燥,况且是前端页面,免不了写一些js和css.而laravel是偏重后端的,所以为了给后端的开发同学缓冲的时间,我们跳过视图 ...

  7. laravel artisan 后台运行_3分钟短文:Laravel用户自定义命令行简明教程

    引言 完成一个功能需求,有时候并不需要一个界面UI,比如定时任务,后台任务, 对于这类任务往往比较耗时,在一个web页面生命周期内,要拖的很久.这时候我们 需要将其放在后台交给操作系统执行. 本期说一 ...

  8. 语句作用_3分钟短文:Laravel模型作用域,为你“节省”更多代码

    引言 原则上代码写一次,处处是引用,不需要大量的冗余代码,这是一种趋势,也是提高代码健壮性的努力方向. laravel模型为我们提供了一层数据库操作层,将数据交互独立出来. 但是久而久之,随着项目的需 ...

  9. sql查询无结果返回空_3分钟短文 | Laravel 查询结果检查是不是空,5个方法你别用错...

    引言 Laravel 提供了 Eloquent ORM 对象用于操作数据库,将其进行抽象方便操作. 因为设计的灵活度,大家在使用Model查询数据集的时候,会面临结果为空,记录不存在的问题, 那么如何 ...

最新文章

  1. PHP文件上传和文件操作案例
  2. Win64 驱动内核编程-3.内核里使用内存
  3. 现实工程中常用到的C语言函数总结(不断更新)
  4. 006_FastDFS文件上传
  5. 【安全漏洞】Emissary 的SSRF漏洞(CVE-2021-32639)发现过程
  6. LeetCode Algorithm 572. 另一棵树的子树
  7. 国内创业活动平台,创业赛事报名网站
  8. javascript 学习笔记三 之 变量
  9. 【BZOJ 3191】[JLOI2013]卡牌游戏
  10. java抽象类重载_在JAVA中使用一个抽象方法的重载方法
  11. jquery触发点击事件
  12. 你是你产品的头号用户
  13. python中的装饰器、装饰器模式_浅析Python装饰器以及装饰器模式
  14. otn与stn网络_光通信网络
  15. 微信公众号粉丝迁移代办最新流程
  16. 2022 年江苏省职业院校技能大赛(中职) 网络搭建与应用赛项公开赛卷
  17. Scipy_常用统计函数
  18. Oracle EBS专业术语与名词解释
  19. AutomationAnywhere(AA)实现读取Excel文件
  20. 田纳西大学计算机科学,田纳西大学_田纳西大学(University of Tennessee)

热门文章

  1. spring中@Value的使用(读取配置文件信息)
  2. 32 - I. 从上到下打印二叉树
  3. Dockerfile文件详解
  4. 单片机学c语言还是python好_单片机开发用哪种语言最好?
  5. 天梯赛L2-014 列车调度(set和简单贪心)
  6. 建堆解决TopK问题
  7. nginx 调用dll_使用DLL中的资源
  8. mysql 分区表_MySQL 分区分表应用场景分析和分区中可能遇到的坑点
  9. python io_Python 的 io.StringIO()
  10. Mongodb删除重复数据