【问题标题】:WordPress Contact Form 7 Regex validation handles differently than online regex testers?WordPress 联系表 7 正则表达式验证的处理方式与在线正则表达式测试器不同吗?
【发布时间】:2017-09-18 13:06:00
【问题描述】:

WordPress 中使用 Contact Form 7 插件尝试验证输入 从“€ 5000”开始,步长为 5000。因此可能的输入是“€ 10.000”、“€ 15.000”、“€ 255000”等。

“€ 2000”、“€ 5050”等输入值应为FALSE

我使用在线正则表达式测试器构建的表达式工作(php)

/^[€]\s(1?[5]000|[1-9]{1}[5,0]{1,3}([0]{3,10}))$/

查看工作示例 -> https://regex101.com/r/PvqlES/2

当我在functions.php中将确切的正则表达式导入我的WordPress函数时,它在regex101环境中工作,但它没有按预期进行验证。

这是我写在functions.php底部的函数:

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

function validate_price( $result, $tag ) {
    if( 'participationPrice' == $tag->name) {
        $participationPrice = isset( $_POST['participationPrice'] ) ? trim( $_POST['participationPrice'] ) : '';
        if (!preg_match("/^[€]\s(1?[5]000|[1-9]{1}[5,0]{1,3}([0]{3,10}))$/g", $participationPrice)){
            $result->invalidate( $tag, "Please provide a value similar to '€ 5000' with steps of 5000." );
        }
    }
 return $result;
}

这是联系表格 7 的标签:

[text* participationPrice]

表单确实会检查验证,因为它显示了错误消息:

error message validates

问题:为什么在线正则表达式测试器可以正确验证,但一旦导入 WordPress 就无法正确验证。我只能假设正则表达式需要一些调整,以便 WordPress 能够理解它。我做错了什么/错过了什么?

我使用一个非常简单的正则表达式测试,看看它是否会通过:

/^[0-9]{0,1}$/

然而,这个正则表达式确实可以按预期工作。

奖励,如果有更好的验证方法,比如输入必须可以被 5000 整除。这将是一种更好的验证方式,因为我确信当前的正则表达式有很多漏洞。

提前致谢!

【问题讨论】:

  • 仅供参考:不要在 PHP 正则表达式中使用 g 修饰符。另外,试试if (!preg_match("/^€\s*(1?5000|[1-9][5,0]{1,3}0{3,10})$/u", ...))。如果你想知道这个数字是否可以整除,提取所有价格,preg_match_all('~^€\s*\K\d+$~u', $s, $matches),然后使用适当的PHP方法检查$matches[1]中的数字是否可以被5000整除。
  • 你很快!谢谢,今天晚些时候我会测试这个。迷惑了一整天,我去呼吸新鲜空气。

标签: php regex wordpress validation contact-form-7


【解决方案1】:

您可以使用 '~€\s*\K\d+~u' 正则表达式从字符串中提取任何数字,然后通过简单检查该数字是否可以除以 5000 来过滤结果数组:

$s = "€ 5000\n€ 3000\n€ 10000\n€ 13000\n€ 20000\n\n€ 5000\n€ 3000\n€ 100000\n\n€ 13000\n€ 200000\n\n€ 200000000000\n\n\n€ 255000\n€ 2555000\n€ 255000";
if (preg_match_all('~€\s*\K\d+~u',$s, $matches)) {
    print_r(array_filter($matches[0], function ($m) { return $m % 5000 === 0; }));
}

模式 €\s*\K\d+ 匹配 ,然后是 0+ 个空格字符(与 \s*),然后使用 \K 匹配重置运算符丢弃匹配字符,然后 \d+ 匹配 1 个或多个数字。

sample PHP demo 的输出:

Array
(
    [0] => 5000
    [2] => 10000
    [4] => 20000
    [5] => 5000
    [7] => 100000
    [9] => 200000
    [10] => 200000000000
    [11] => 255000
    [12] => 2555000
    [13] => 255000
)

【讨论】:

    猜你喜欢
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多