入门 - 搜索字符串

  • 作者:KK

  • 发表日期:2016.9.5


速读(主要是strpos函数)

var_export([
	"strpos('apple', 'a')" => strpos('apple', 'a'), //0
	"strpos('apple', 'a')" => strpos('apple', 'p'), //1
	"strpos('apple', 'a')" => strpos('apple', 'l'), //3
	"strpos('apple', 'a')" => strpos('apple', 'x'), //false 找不到
	"菜鸟误区1" => strpos('apple', 'a') == 0, //true
	"正确姿势" => strpos('apple', 'a') === false, //false
]);

应用在逻辑判断上:

if(strpos('apple', 'a')){
	//不成立,菜鸟误区1
	echo '找到了';
}

if(strpos('apple', 'a') != false){
	//不成立,菜鸟误区2
	echo '找到了';
}

if(strpos('apple', 'a') !== false){
	//成立!这才是正确姿势
	echo '找到了';
}

正文

  • strpos函数

    如果网站要判断用户有没有输入粗口,新手可能会这么做:

    $_POST = ['name' => '今天天气真去死啊']; //模拟数据
    if(strpos($_POST['name'], '死')){
    	echo '尊敬的用户请您别爆粗';
    }else{
    	//...
    }
    

    上面的逻辑可以判断出“死”字,但是如果字符串的值是下面这样就会进入else了

    $_POST = ['name' => '死今天天气真去啊'];
    if(strpos($_POST['name'], '死')){
    //if(0){   相当于这样
    
    	//...
    }else{
    	echo '你真文明啊'; //会进入这里
    }
    

    因为strpos返回的字符串出现位置是从0开始算的,如果要搜索的字符串在第1个字符,那就返回0,第2个字符就是1。字符串其实就是数组,一个字符一个数组元素,第一个字符就是第0个元素这么理解吧

    所以上面的代码就其实变成了if(0)于是无法判断成立而进入了else

    我推荐使用if(strpos($_POST['name'], '死') !== false)这样来判断,但注意不要用!= false

    $_POST = ['name' => '死今天天气真去啊'];
    if(strpos($_POST['name'], '死') != false){
    //if(0 != false){   相当于这样
    //if(false){   于是成了这样
    
    	//...
    }else{
    	echo '你真文明啊'; //还是会进入这里
    }
    

  • strstr函数

    这个函数倒比较简单理解,就是把查找到的字符串以及后面的内容都返回来:

    var_export([
    	"strstr('apple', 'p')" => strstr('apple', 'p'), //pple
    	"strstr('apple', 'l')" => strstr('apple', 'l'), //le
    	"strstr('apple', 'x')" => strstr('apple', 'x'), //空
    ]);