我正在努力找出验证手机号码的最佳方法。问题是我必须将此号码插入外部系统,目前有些东西导致它失败。我在前端有一些基本的验证,确保它小于20,并且可以包含数字,+, - 和()。虽然我正在验证移动设备,但移动设备可能位于任何国家/地区,这就是我允许其他一些角色的原因。
问题是,除了+之外的这些附加字符不能插入到这个外部系统中(尽管它们在我自己的数据库中使用)。首先,我删除它们
$phone = str_replace([' ', '-', '(', ')'], '', $this->mobile);
下一条规则是,如果是英国号码,则从提供的号码中删除起始号
if (substr($phone, 0, 4) === '+440') {
$this->mobile = str_replace('+440', '+44', $phone);
}
所以,如果此时一切都很好,我知道英国号码的长度为13个字符(加上+44并删除0后)
为了处理不同的情况(他们没有使用+44,或者它是国际手机)我添加了以下内容
if (strlen($phone) !== 13) {
$lastTen = substr($phone, -10);
$prefix = substr($phone, 0, 3);
if($prefix === '+44') {
$this->mobile = $prefix . $lastTen;
} elseif (substr($phone, 0, 1) === '+') {
$this->mobile = $phone;
} else {
$this->mobile = '+44' . $lastTen;
}
}
因此,如果长度不是13个字符,我会选择最后十个和前三个字符。如果它开始+44,我将最后10个附加到此。我这样做的原因是我注意到很多时候人们似乎重复自己,例如+ 447711 + 447711222222(+44对数字主体有一个单独的输入字段)
如果它以加号开头,但不是+44,我认为它是一个国际号码,所以我不碰它。
如果它没有以加号开头,我只取最后10个并将其附加到+44(大多数情况下它将是英国数字)
所以目前的工作正常,但有些情况下额外的优势会使它成为最终的字符串。
我真的在考虑如何清理更多东西,并确保字符串开头只有一个加号?
由于