如何用substr检测$_POST内容?排查检测'Project :'失败原因
嘿,我来帮你梳理下这个检测失败的几个常见原因,一个个来看:
首先最可能的问题是你算错了目标字符串的长度!咱们数一下:Project : 这个字符串是 9个字符(P、r、o、j、e、c、t、空格、冒号),但你的代码里用了substr($_POST['project'],0,8),只取了前8个字符,拿到的是Project (最后是空格,少了冒号),自然永远匹配不上。这应该是最核心的问题。
除了这个,还有几个常见的坑:
大小写不匹配:如果实际提交的内容是小写开头的
project :,而你检测的是大写Project :,大小写敏感的比较就会失败。可以用不区分大小写的判断,比如strcasecmp(substr($_POST['project'],0,9), 'Project :') === 0,或者更简单的用stripos判断开头。存在不可见的空白字符:比如提交的内容开头有空格、制表符或者换行符,比如实际是
Project :xxx,这时候前9个字符就不是Project :了。建议先对字符串做 trim 处理,比如$projectStr = trim($_POST['project']);,再进行判断。$_POST['project']字段不存在:如果表单里没有name为
project的输入项,或者请求不是POST方式,那$_POST['project']会未定义,不仅判断失败,还会抛出警告。可以先加个存在性检查:if (isset($_POST['project']) && ...)。
另外,推荐一个更可靠的写法,不用手动数字符长度,直接用strpos判断是否以目标字符串开头:
if (isset($_POST['project']) && strpos($_POST['project'], 'Project :') === 0) { $project = $_POST['project']; }
这里用=== 0是因为如果目标字符串在开头,strpos会返回0,而如果不存在会返回false,用全等判断可以避免把0当成false的情况。
内容的提问来源于stack exchange,提问作者user3766071

