【问题标题】:Contact Form 7 Regular Expression Validation联系表格 7 正则表达式验证
【发布时间】:2017-12-31 19:41:03
【问题描述】:

我正在尝试向 Contact Form 7 的“姓氏”字段添加正则表达式验证,以允许使用连字符的名称。我已经研究并编写了一个函数来实现这一点,但它似乎不起作用。任何帮助将不胜感激。

这是我写的函数,放在functions.php文件中...

add_filter('wpcf7_validate_text', 'custom_text_validation', 20, 2);
add_filter('wpcf7_validate_text*', 'custom_text_validation', 20, 2);

function custom_text_validation($result, $tag) {
    $type = $tag['type'];
    $name = $tag['name'];

    if($name == 'last-name') {
        $value = $_POST[$name];
        if(!preg_match('[a-zA-Z\-]', $value)){
            $result->invalidate($tag, "Invalid characters");
        }
    }
    return $result;
}

【问题讨论】:

    标签: wordpress contact-form-7


    【解决方案1】:

    尝试否定它

    if(preg_match('/[^a-z\-]/i', $value)){
    

    我还更新了它以使用/i,它将忽略大小写

    【讨论】:

    • 谢谢,但这仍然不起作用。该表单仍然接受任何字符。您似乎还添加了数值。输入字段只能接受字母和连字符。
    • 看起来,根据接受的答案,您有可能导致它接受任何字符的其他问题。我认为这仍然可以根据您希望接受仅包含字母和连字符的字符串的原始要求起作用。我很好奇,你介意测试我包含的更新代码吗?我想知道它是否适用于其他固定(另外,请注意我没有“注意” preg_match)
    【解决方案2】:

    所以我认为我们首先需要查看的是您的第 5th 和 6th 行。根据CF7 documentation$tag 参数实际上返回一个对象而不是数组。

    这意味着$tag['name']$tag['type'] 实际上应该是$tag->name$tag->type

    要解决的第二件事是您的正则表达式,现在是阅读Falsehoods Programmers Believe about Names 的好时机。基本上,简而言之,如果条件是 MixedAlpha 和破折号,则有很多姓氏不匹配。

    但是,如果您打算删除一部分潜在用户,我建议您使用mačekthis SO answer 上列出的基本正则表达式,因为它至少会包含更多潜在的有效姓氏。

    这会将你的函数变成这样的:

    add_filter('wpcf7_validate_text', 'custom_text_validation', 20, 2);
    add_filter('wpcf7_validate_text*', 'custom_text_validation', 20, 2);
    
    function custom_text_validation($result, $tag) {
        $type = $tag->type; //object instead of array
        $name = $tag->name; //object instead of array
    
        if($name == 'last-name') {
            $value = $_POST[$name];
            if(!preg_match("/^[a-z ,.'-]+$/i", $value )){ //new regex statement
                $result->invalidate($tag, "Invalid characters");
            }
        }
        return $result;
    }
    

    【讨论】:

    • 感谢您帮我清理了一些代码。该表单仍在接受未经任何验证的数字。有什么我可能会错过的吗?
    • 随时。您是否 100% 确定输入的名称是正确的?它不是“姓氏”或类似的东西吗?如果它仍然允许数字,那么它在两个 IF 语句之一中失败。我的第一个猜测是输入名称错误?你能仔细检查一下吗?
    • 是的,我很肯定输入名称是“姓氏”。这是表单的一部分...
      [text* first-name placeholder "First Name"]
      [文本* 姓氏占位符“姓氏”]
    • 好酷。能否尝试将两个 add_filter 函数的优先级从 20 提高到 100?
    • 感谢您的帮助。在我添加了覆盖的 jquery 验证插件之前,我发现了开发网站的员工。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    相关资源
    最近更新 更多