【发布时间】: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]
表单确实会检查验证,因为它显示了错误消息:
问题:为什么在线正则表达式测试器可以正确验证,但一旦导入 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