[英]Create regex and validate mobile phone number for Denmark
我找到了以下正則表達式( ^(((?+45)?)?)(\s?\d{2}\s?\d{2}\s?\d{2}\s?\d{ 2})$ ) 和 ( /(?:45\s)?(?:\d{2}\s){3}\d{2}/ ) 驗證丹麥手機號碼。 但是,它與以下也是有效手機號碼的輸入不匹配:
4511760574, 004511760574
手機號碼只有在號碼是以下之一時才有效
a) 它的 8 位數字 b) 以 45、+45 或 0045 開頭的 8 位數字 c) 排除 45、+45 或 0045 后的前兩位數字應如下所示(標有藍色的部分):
資料來源: https://en.wikipedia.org/wiki/Telephone_numbers_in_Denmark
PS:如果 (c) 是最新的,我不是 100% 有信心。 但是,如果使用 (c) 發生任何更新,我可以通過調整來輕松更改正則表達式
以下是僅與問題相關的代碼片段:
****HTML****
<input type="text" class="form-control num-only-with-plus rounded-0" id="phone"
placeholder="Telefonnummer" required maxlength="12">
<div id="phone-number-feedback" class="invalid-feedback">Invalid Number</div>
****JS****
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"
integrity="sha512-WFN04846sdKMIP5LKNphMaWzU7YpMyCU245etK3g/2ARYbPK9Ub18eG+ljU96qKRCWh+quCY7yefSmlkQw1ANQ=="
crossorigin="anonymous"></script>
<script type="text/javascript">
function validateMobileNumber(phone) {
const pattern = /(?:45\s)?(?:\d{2}\s){3}\d{2}/g;
return pattern.test(String(phone).toLowerCase());
}
//Allow only digit and '+' sign on the input field
$('.num-only-with-plus').keypress(function (e) {
if (e.key != '+' && e.which != 8 && e.which != 0 && (e.which < 48 || e.which > 57)) {
return false;
}
$('#phone').keyup(_.debounce(function () {
const phone = $(this)
if (validateMobileNumber(phone.val())) {
phone.toggleValid()
$('#submit_btn').prop('disabled', false)
} else {
phone.toggleInvalid();
$('#phone-number-feedback').text("Tjek venligst mobilnummeret igen. Er det okay?")
$('#submit_btn').prop('disabled', true)
}
}, 500));
</script>
請幫忙!
讓我們通過 go 來構建一個模式:第一個和第二個...
a) 其任一 8 位數字
b) 或以 45、+45 或 0045 開頭的 8 位數字
...相當直接,可以這樣表達:
(?:(?:00|\+)?45)?\d{8}
這個表達式的核心是\d{8}
部分(意思是 8 個數字)。 在它之前的是“雙重可選”部分,大致意思是“ ......可選地前面有45
,它本身可以可選地前面有00
或+
符號”。 ?:
印記用於防止正則表達式引擎捕獲這些字符組的內容,從而使模式更快一點,內存消耗更少。
到目前為止,一切都很好,但是我們如何表達第三個要求,即在\d{8}
部分的開頭有一組特定的數字? 雖然可以修改“核心部分”以包含這些子句,但還有一個更易於維護的替代方案 - 積極的前瞻:
(?=2|31|4[012]|4911|5[0-3]|6[01]|[78]1|9[123])
僅當檢查字符串中的特定 position 后跟 2、31、40-42、4911、50-53、60-61、71、81 或91-93 - 就像在那個 wiki 頁面上寫的那樣。 如果有任何變化,很容易更新該部分而無需觸及正則表達式的任何其他部分。
所以最終的模式看起來像這樣:
^(?:(?:00|\+)?45)?(?=2|31|4[012]|4911|5[0-3]|6[01]|[78]1|9[123])\d{8}$
這是regex101 演示,您可以使用它來玩模式和示例字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.