我有一个奇怪的东西,可能是一些愚蠢的东西,但我已经在它上面绞尽脑汁太久了。
我正在使用 strpos() 来查看字符串是否以某个子字符串结尾,根据 PHP 文档使用所述子字符串长度的负偏移量。据推测,它会从大海捞针的末端搜索 x 个字符。
var_dump($recipient); //debug
if(strpos( $recipient, '_redacted', -9 ) === FALSE) {
// do stuff
}
它只是抱怨偏移量不包含在字符串中。然而输出是:
string(29)“[电子邮件受保护]_redacted”
遇到 PHP 错误
严重性:警告 消息:strpos():字符串中不包含偏移量
可以清楚地看到该字符串比 9 个字符长得多,那么为什么它会抛出该警告?(并且通过扩展返回 FALSE 并总是错误地触发我的条件)
PHP 7.1 中添加了对负偏移量的支持。
您可能正在运行旧版本。
请务必查看手册页上的更改日志部分。
我也有这个错误。由于该错误,它还产生了堆栈跟踪:
致命错误:未捕获的 ValueError:strrpos():参数 #3 ($offset) 必须包含在 proc.php:963 中的参数 #1 ($haystack) 中
堆栈跟踪:
#0 proc.php(963): strpos('', '`', -1)
#1 {主要}
在线 963 中抛出
proc.php
如您所见,它表明第一个参数(代码中的变量)已计算为空字符串,并且该空字符串中不允许使用负偏移量 1。因此,如果发生这种情况,您似乎总是必须使用 strlen 检查。
顺便说一句:strrpos 不是一个解决方案。如果将上面的代码替换为“strrpos('', '`', 1)”,您会得到相同的错误。
你可以尝试改变 if 语句的逻辑
var_dump($recipient); //debug
if(strpos( $recipient, '_redacted') === strlen($recipient) - 9) {
// do stuff
}
尝试一下,让我知道它是否适合您