如何修改preg_match验证规则:拦截MT但允许PMT,避免误匹配
解决正则误匹配PMT中MT的问题
原代码里的正则/(MT|GT)(\d+)/i会错误匹配"PMT"里的"MT"片段,导致合法的PMT内容被误拦截。要实现拦截独立的MT/GT+数字组合,但允许PMT+数字通过,只需给正则添加负向后瞻断言,限制MT/GT前面不能有英文字母。
修改后的正则说明
将原正则替换为:
/(?<!([A-Z]))(MT|GT)(\d+)/i
各部分作用:
(?<!([A-Z])):负向后瞻断言,确保MT/GT前面没有任何英文字母(i修饰符忽略大小写,对小写字母同样生效)(MT|GT):匹配目标拦截字符串MT或GT(\d+):匹配后续的一个或多个数字
修改后的完整代码
function wppbc_custom_input_validation($message, $field, $request_data, $form_location) { if ($field['field'] == 'Input' && $field['meta-name'] == 'input_field') { $field_data = $request_data[$field['meta-name']]; // 添加负向后瞻断言,避免匹配PMT中的MT片段 if (preg_match('/(?<!([A-Z]))(MT|GT)(\d+)/i', $field_data) === 1) { return 'Not allowed.'; } if (preg_match('/[A-Z]+\d+/i', $field_data) === 0) { return 'Invalid number'; } } return $message; }
验证效果
- 被拦截内容:
MT123、gt456(MT/GT前面无字母,符合拦截规则) - 允许通过内容:
PMT789(MT前面有字母P,不会触发拦截)、abcMT123(MT前面有字母,不会触发拦截)
内容的提问来源于stack exchange,提问作者Claschy
相关产品推荐
相关产品推荐

