在 if() 语句中比较 substr() 和 strpos() 的逻辑错误

Logic fault with substr() and strpos() in comparison in if() statement

我会把这归因于我的数学能力薄弱,因为我无法找到该脚本的有效解决方案。极不可能是这些 php 函数中的错误。

只有当 $value 字符串 的前五个字符 与 $master 字符串不匹配时,表单才应每次验证并允许提交。绕圈子试图让它正常运行。预先感谢您提供任何提示或建议。

示例 1:

Joey ($value)
Joey123 ($master) 

在上述实例中,表单 不应 验证字符串中的前 0-5 个字符是否匹配。 但是,上面的例子允许表单验证

示例 2:

Joey ($value)
Joey ($master) 

在上述实例中,表单 returns 错误且无效。正如预期的那样,弹出了错误的验证消息。

我认为问题在于第一个 if() 检查 $result['is_valid'],所以我正在 运行 各种测试,有和没有这个初始声明。

add_filter('gform_field_validation_1_4', function ( $result, $value, $form, $field ) {

    $value = substr($value, 0, 5);
    $master = substr(rgpost('input_5'), 0, 5);

    if ($result['is_valid'] && strpos($value, $master) !== false) {
        $result['is_valid'] = false;
        $result['message']  = 'If you are having trouble submitting this form, please call us directly.';
    }
    echo 'Master: ' . $master;
    echo 'Value: ' . $value;
 
    return $result;
}, 10, 4 );

我相信你需要像这样反转 strpos 中的参数:

// change this
strpos($value, $master)

// to this
strpos($master, $value)

根据 php 文档,顺序是“haystack”然后是“needle”:https://www.php.net/manual/en/function.strpos.php

好吧,我相信我已尽我所能,但它似乎确实按预期工作(尽管如果名字和姓氏的前 5 个字符相同,则可能存在一些缺点)。我使用 str_contains() 函数 (php8),然后检查任何长度的相同匹配项,因为这是通过的两种主要类型的垃圾邮件,现在垃圾邮件已经停止!

感谢 mikerojas 让我走上正确的轨道来修复我的原始有缺陷的代码。

add_filter('gform_field_validation_1_4', function ( $result, $value, $form, $field ) {


//$haystack = substr(rgpost('input_5'), 0,5);
//$value = substr($value, 0,5);

$haystack = rgpost('input_5');
$value = substr($value, 0,5);


if ($result['is_valid'] && str_contains($haystack, $value) == !false or $result['is_valid'] && $haystack == $value) {
    $result['is_valid'] = false;
    $result['message']  = 'If you are having trouble submitting this form, please call us directly.';
}

echo 'Haystack: ' . $haystack;
echo 'Value: ' . $value; 

return $result; }, 10, 4 );