我需要一个正则表达式来验证具有以下条件的字符串
- 字符串可能包含任何数字空格 + - () / 。
如果字符串包含其他任何内容,那么它应该是无效的 - 如果字符串中有 + 则应该在开头,最多有一个 + ,否则无效,如果有多个 + 则无效
- 字符串长度应为 7 到 20 个字符
- 所有这些数字都不是必须有空格 + - () / 。
但必须包含至少 7 位数字
我需要一个正则表达式来验证具有以下条件的字符串
我认为您正在使用E.164格式验证电话号码。电话号码可以包含许多其他格式。它也可以包含.
。一个数字中有多个空格并不少见。因此,最好将所有数字格式化为通用格式并将该格式存储在 db 中。如果该通用格式错误,您可能会抛出错误。
我像这样验证那些电话号码。
function validate_phone($phone){
// replace anything non-digit and add + at beginning
$e164 = "+". preg_replace('/\D+/', '', $phone);
// check validity by length;
return (strlen($e164)>6 && strlen($e164)<21);
}
如果有效,我在这里存储$e164
在 Db 中。
即使在那之后,您也无法验证电话号码。有效的电话号码格式并不意味着它是有效的号码。为此,会针对该号码生成一条短信或呼叫,并发送激活码。一旦用户输入代码,电话号码就被完全验证了。
咱们试试吧 ...
preg_match('/^(?=(?:.*\d){7})[+\d\s()\/\-\.][\d\s()\/\-\.]{6,19}$/', $text);
打破这个:
您可以在一个正则表达式中执行此操作:
/^(?=(?:.*\d){7})[0-9 ()\/+-][0-9 ()\/-]{6,19}$/
但是我个人会做类似的事情:
/^[0-9 ()\/+-][0-9 ()\/-]{6,19}$/
然后剥离任何非数字并查看剩余的字符串是否为 7 或更长。
更简洁一点:
^\+?(?=(.*\d){7})[()/\d-]{7,19}$
'当然,你为什么还要使用正则表达式?
function is_valid($string) {
$digits = 0;
$length = strlen($string);
if($length < 7 || $length > 20) {
return false;
}
for($i = 0; $i < $length; $i++) {
if(ctype_digit($string[$i])) {
$digits++;
} elseif(strpos('+-() ', $string[$i]) === false && ($string[$i] !== '+' || $i !== 0)) {
return false;
}
}
return $digits >= 7;
}