簡體   English   中英

為丹麥創建正則表達式並驗證手機號碼

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM