php中strpos函数判断字符存在误区
在php中strpos是查找字符串首次出现的位置,如果存在就返回ture或相关具体数字,没有就返回0或false了,但本人要用它做一个wordpress关键词黑名单反垃圾评论时发现一些问题,下面我们来看看。
修改主题comments-ajax.php文件
在主题目录下的comments-ajax.php文件中,大概60行左右的位置(刚取得用户提交的评论表单中的$_POST['author']等字段)。然后在该文件中加上下面的代码:
代码如下 | 复制代码 |
/* |
4 后记
通过上面这段简单代码,我们就实现了提交对评论输入的用户昵称、评论内容进行了黑名单中的关键词的校验。一旦匹配到了上面的任何一个词语,例如出现了www,那么就提示用户“广告必删,多谢理解!”,效果如下图所示。这样算是又给博客上了一道保险,增强了wordpress反垃圾评论的免疫力,而且还是非插件的方法实现的哟!
上面看上没问题,但是上午 @坏 童鞋一个邪恶测试,发现了上篇文章代码的BUG。晚上下班回来,仔细看了下代码,发现是自己对strpos函数的片面认识,因此做个笔记Mark一下。
2 strpos函数的原型
相信大家对strpos函数并不陌生,经常在字符串的处理中能看到它的身影。strpos函数原型是:
/*
* @Para string $source: 在该字符串中进行查找[*]
* @Para mixed $target: 要查找的字符串;如若不是字符串,将被转换为整型并被视为字符的顺序值[*]
* @Para int $offset: 查找的起始位置
* @Return int/boolean: 成功则返回第一次出现的位置; 失败返回 FALSE 值
**/
int strpos(string $source, mixed $target [, int $offset = 0 ]);
3 strpos函数的简单测试
了解了strpos函数的原型之后,我们先来看一段简单的测试代码。
代码如下 | 复制代码 |
/* * @Author: vfhky 2013年09月21日20:35 * @Description: 通过两个不同的测试变量$test_1和$test_2直击关键 **/ $words = "com,cn,info,net,www,http,cc,host,代理,移动,电,国,港,日,购"; $word = explode(',', $words); $num = count($word); $test_1 = "购买TT"; for($i=0;$i if (strpos($test_1,$word[$i],0)){ echo '广告必删,多谢理解!'; break; } } echo " ----------This is $test_1 END---------- "; $test_2 = "坏坏购买TT"; for($i=0;$i if (strpos($test_2,$word[$i],0)){ echo '广告必删,多谢理解!'; break; } } echo " ----------This is $test_2 END---------- "; ?> |
测试结果如下图所示:
再议wordpress反垃圾评论:都是strpos函数惹的祸
4 strpos函数的测试结果分析
上面这段代码中有两个不同的测试变量$test_1和$test_2,并且二者都包含了黑名单中的关键词:购。但是从图中显示的测试结果来看,$test_1变量没有别有效屏蔽,而变量$test_2却被提示包含广告词。奥秘就在于变量$test_1和$test_2中的“购”字出现的位置就!当关键词“购”出现在最前面时($test_1),strpos($test_1,$word[$i],0)函数的执行结果为0,因为“购”字在字符串“购买TT”的最前面。那么for循环中的if语句变成了if(0){},从而不会被视为垃圾评论,这就造成了BUG。下面分别是继续用strpos函数和使用PHP正则表达式,两种方法来实现“wordpress关键词黑名单:反垃圾评论再升级”。
5.1 正确使用strpos函数修正BUG
代码如下 | 复制代码 |
/* |
5.2 使用PHP正则表达式修正BUG
代码如下 | 复制代码 |
/* * @Author: vfhky 2013年09月24日20:06 * @Description: 使用PHP正则表达式修正BUG,实现“wordpress关键词黑名单:反垃圾评论再升级(非插件)” **/ $words = "com,cn,info,net,www,http,cc,host,代理,移动,电,国,港,器,服,医,肥,药,农,信,贷,日,购,播"; $word = explode(',', $words); $num = count($word); for($i=0;$i if( preg_match("/$word[$i]/i", $comment_author) || preg_match("/$word[$i]/i", $comment_content) ){ err( __('广告必删,多谢理解!') ); break; } } |
6 函数strpos的重要提醒
使用strpos函数还需要注意的一点就是:它可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值。
例如返回整型0,浮点型值0.0,空字符串,字符串 "0",不包括任何元素的数组,不包括任何成员变量的对象,特殊类型NULL等等。
因此,应使用会检查返回的值的类型的恒等运算符“===”来测试此函数的返回值,而不是使用简单的等号“==”来判别。
7Update 2013.09.26 22:27
经过 @星河大帝 的提醒,可以使用数组来代替字符串,执行效率应该差不多。
7.1 使用strpos函数+数组修正BUG
代码如下 | 复制代码 |
$words = array("com","cn","info","net","www","http","cc","host","代理","移动","电","国","港","购"); |
7.2 使用正则式+数组修正BUG
代码如下 | 复制代码 |
$words = array("com","cn","info","net","www","http","cc","host","代理","移动","电","国","港","购"); $num = count($words); for($i=0;$i if( preg_match("/$words[$i]/i", $comment_author) || preg_match("/$words[$i]/i", $comment_content) ){ err( __('广告必删,多谢理解!') ); break; } } |

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Atom editor mac version download
The most popular open source editor

SublimeText3 Linux new version
SublimeText3 Linux latest version

SublimeText3 Mac version
God-level code editing software (SublimeText3)

SublimeText3 English version
Recommended: Win version, supports code prompts!

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.