Valideer telefoonnummer met JavaScript

Ik heb deze code op een website gevonden en het werkt perfect. Het valideert dat het telefoonnummer in een van deze indelingen is:
(123) 456-7890 of 123-456-7890

Het probleem is dat mijn cliënt (ik weet niet waarom, misschien klantgen) een ander formaat wil toevoegen, de tien nummers achtereenvolgens, zoiets als dit: 1234567890 .

Ik gebruik deze reguliere expressie,

/^(\()?\d{3}(\))?(-|\s)?\d{3}(-|\s)\d{4}$/

Hoe kan ik hieraan toevoegen dat het ook het andere formaat valideert? Ik ben niet goed met reguliere uitdrukkingen.


Antwoord 1, Autoriteit 100%

Ten eerste, uw formaatvalator is natuurlijk alleen geschikt voor nanp (landcode +1) nummers. Wordt uw applicatie gebruikt door iemand met een telefoonnummer van buiten Noord-Amerika? Zo ja, wilt u niet voorkomen dat die mensen een perfect geldig [internationaal] nummer invoeren.

In de tweede plaats is uw validatie onjuist. NANP-nummers Neem het formulier NXX NXX XXXXwaar Neen cijfer 2-9 is en Xis een cijfer 0-9. Bovendien nemen gebiedscodes en uitwisselingen mogelijk niet het formulier N11(eindig met twee) om verwarring met speciale diensten te voorkomen, behalve nummers in een niet-geografisch gebiedscode (800, 888, 877, 866, 855, 900) kan een N11Exchange hebben.

Dus, uw regex passeert het nummer (123) 123 4566, ook al is dat geen geldig telefoonnummer. U kunt dat oplossen door het vervangen van \d{3}met [2-9]{1}\d{2}.

Eindelijk, ik krijg het gevoel dat u de gebruikersinvoer in een webbrowser valideert. Onthoud dat client-side-validatie alleen een gemak u verstrekt aan de gebruiker ; U moet nog steeds alle invoer (opnieuw) op de server valideren.

TL; DR Gebruik geen reguliere expressie voor valideer complexe real-world data zoals telefoonnummers of URL’s . Gebruik een gespecialiseerde bibliotheek .


Antwoord 2, Autoriteit 128%

Mijn regex naar keuze is:

/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im

Geldige formaten:

(123) 456-7890
(123) 456-7890
123-456-7890
123.456.7890
1234567890
+31636363634
075-63546725


Antwoord 3, Autoriteit 51%

Als u op zoek bent naar 10 en slechts 10 cijfers, negeert u alles behalve de cijfers –

  return value.match(/\d/g).length===10;

Antwoord 4, Autoriteit 28%

/^[+]*[(]{0,1}[0-9]{1,3}[)]{0,1}[-\s\./0-9]*$/g

(123) 456-7890
+ (123) 456-7890
+ (123) -456-7890
+ (123) – 456-7890
+ (123) – 456-78-90
123-456-7890
123.456.7890
1234567890
+31636363634
075-63546725

Dit is een zeer losse optie en ik hou het liever zo, meestal gebruik ik het in registratieformulieren waar de gebruikers hun telefoonnummer moeten toevoegen.
Meestal hebben gebruikers problemen met formulieren die strikte opmaakregels afdwingen, ik geef er de voorkeur aan dat de gebruiker het nummer en de indeling in het scherm invult of voordat het in de database wordt opgeslagen.
http://regexr.com/3c53v


Antwoord 5, autoriteit 24%

Wat ik zou doen is het formaat negeren en de numerieke inhoud valideren:

var originalPhoneNumber = "415-555-1212";
function isValid(p) {
  var phoneRe = /^[2-9]\d{2}[2-9]\d{2}\d{4}$/;
  var digits = p.replace(/\D/g, "");
  return phoneRe.test(digits);
}

Antwoord 6, autoriteit 21%

De volgende REGEX valideert elk van deze formaten:

(123) 456-7890
123-456-7890
123.456.7890
1234567890

/^[(]{0,1}[0-9]{3}[)]{0,1}[-\s\.]{0,1}[0-9]{3}[-\s\.]{0,1}[0-9]{4}$/

Antwoord 7, autoriteit 13%

Waar str een van deze formaten kan zijn:
555-555-5555
(555)555-5555
(555) 555-5555
555 555 5555
55555555555
1 555 555 5555

function telephoneCheck(str) {
  var isphone = /^(1\s|1|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/.test(str);
  alert(isphone);
}
telephoneCheck("1 555 555 5555");

Antwoord 8, autoriteit 12%

Ik zou willen voorstellen om iets duidelijkers te gebruiken (vooral na te denken over wie de code moet onderhouden)… hoe zit het met:

var formats = "(999)999-9999|999-999-9999|9999999999";
var r = RegExp("^(" +
               formats
                 .replace(/([\(\)])/g, "\\$1")
                 .replace(/9/g,"\\d") +
               ")$");

waar de regexp is opgebouwd uit een duidelijke sjabloon? Het toevoegen van een nieuwe zou dan een no-brainer zijn en misschien kan zelfs de klant dat zelf doen op een “opties”-pagina.


Antwoord 9, autoriteit 6%

Probeer deze eens – deze bevat ook validatie voor internationale indelingen.

/^[+]?(1\-|1\s|1|\d{3}\-|\d{3}\s|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/g

Deze regex valideert het volgende formaat:

  • (541) 754-3010 Binnenlands
  • +1-541-754-3010 Internationaal
  • 1-541-754-3010 Gebeld in de VS
  • 001-541-754-3010 Gebeld vanuit Duitsland
  • 191 541 754 3010 Gebeld vanuit Frankrijk

Antwoord 10, autoriteit 5%

/^\+?1?\s*?\(?\d{3}(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$/

Hoewel dit een oud bericht is, wil ik mijn bijdrage kwijt.
deze worden geaccepteerd:
55555555555
555-555-5555
(555)555-5555
1(555)555-5555
1 555 555 5555
1 555-555-5555
1 (555) 555-5555

deze worden niet geaccepteerd:

555-5555 -> om dit te accepteren gebruik: ^\+?1?\s*?\(?(\d{3})?(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$

555555 -> om dit te accepteren gebruik: ^\+?1?\s*?\(?(\d{3})?(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$

1 555)555-5555
123**&!!asdf#
55555555
(6505552368)
2 (757) 622-7382
0 (757) 622-7382
-1 (757) 622-7382
2 757 622-7382
10 (757) 622-7382
27576227382
(275)76227382
2(757)6227382
2(757)622-7382
(555)5(55?)-5555

dit is de code die ik heb gebruikt:

function telephoneCheck(str) {
  var patt = new RegExp(/^\+?1?\s*?\(?\d{3}(?:\)|[-|\s])?\s*?\d{3}[-|\s]?\d{4}$/);
  return patt.test(str);
}
telephoneCheck("+1 555-555-5555");

Antwoord 11, autoriteit 4%

Dit werkt:

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

Het teken ?geeft aan dat de voorgaande groep nul of één keer moet worden gevonden. De groep (-|\s)komt overeen met een -of een |-teken. Door ?toe te voegen na het tweede voorkomen van deze groep in uw regex, kunt u een reeks van 10 opeenvolgende cijfers matchen.


Antwoord 12, autoriteit 3%

heel eenvoudig

"9001234567".match(/^\d{10}$/g)

Antwoord 13, autoriteit 3%

probeer dit

/^(\+{0,})(\d{0,})([(]{1}\d{1,3}[)]{0,}){0,}(\s ?\d+|\+\d{2,3}\s{1}\d+|\d+){1}[\s|-]?\d+([\s|-]?\d+){1, 2}(\s){0},}$/gm

geldige indelingen

  • (123) 456-7890
  • (123)456-7890
  • 123-456-7890
  • 1234567890
  • +31636363634
  • +3(123) 123-12-12
  • +3(123)123-12-12
  • +3(123)1231212
  • +3(123) 12312123
  • +3(123) 123 12 12
  • 075-63546725
  • +7910 120 54 54
  • 910 120 54 54
  • 8 999 999 99 99

https://regex101.com/r/QXAhGV/1


Antwoord 14

De antwoorden van iedereen zijn geweldig, maar hier is er een die volgens mij iets uitgebreider is…

Dit is geschreven voor het gebruik van javascript-overeenkomsten van een enkel nummer in een enkele regel:

^(?!.*911.*\d{4})((\+?1[\/ ]?)?(?![\(\. -]?555.*)\( ?[2-9][0-9]{2} ?\) ?|(\+?1[\.\/ -])?[2-9][0-9]{2}[\.\/ -]?)(?!555.?01..)([2-9][0-9]{2})[\.\/ -]?([0-9]{4})$

Als u op woordgrenzen wilt matchen, wijzigt u gewoon de ^ en $ To \ b

Ik verwelkom elke suggesties, correcties of kritiek op deze oplossing. Voor zover ik kan zien, komt dit overeen met het NANP-formaat (voor de VS-nummers – ik valideerde geen andere Noord-Amerikaanse landen bij het maken van dit), vermijdt alle 911-fouten (kan niet in het netnummer of de regiocode zijn), elimineert Alleen die 555 nummers die eigenlijk ongeldig zijn (regiocode van 555 gevolgd door 01xx waarbij X = elk nummer).


Antwoord 15

Deze reg ex is geschikt voor internationale telefoonnummers en meerdere indelingen van mobiele celnummers.

Hier is de reguliere expressie:
/ ^ (+ {1} \ D {2,3} \ s? [(] {1} \ D {1,3} [)] {1} \ s? \ D + | + \ D {2,3} \ s {1} \ D + | \ D +) {1} [\ s | -]? \ D + ([\ s | -]? \ D +) {1,2} $ /

Hier is de JavaScript-functie

function isValidPhone(phoneNumber) {
    var found = phoneNumber.search(/^(\+{1}\d{2,3}\s?[(]{1}\d{1,3}[)]{1}\s?\d+|\+\d{2,3}\s{1}\d+|\d+){1}[\s|-]?\d+([\s|-]?\d+){1,2}$/);
    if(found > -1) {
        return true;
    }
    else {
        return false;
    }
}

Dit valideert de volgende indelingen:

+44 07988-825 465 (met elke combinatie van koppeltekens in plaats van ruimte, behalve dat slechts een ruimte de +44)

moet volgen

+44 (0) 7988-825 465 (met elke combinatie van koppeltekens in plaats van spaties, behalve dat er geen koppelteken rechtstreeks voor of na de (0) en de ruimte vóór of na de (0) niet bestaat)

123 456-789 0123 (met elke combinatie van koppeltekens in plaats van de spaties)

123-123 123 (met elke combinatie van koppeltekens in plaats van de spaties)

123 123456 (spatie kan worden vervangen door een koppelteken)

1234567890

Er mogen geen dubbele spaties of dubbele koppeltekens voorkomen voor alle indelingen.


Antwoord 16

Telefoonnummer valideren + geformatteerde gegevens retourneren

function validTel(str){
  str = str.replace(/[^0-9]/g, '');
  var l = str.length;
  if(l<10) return ['error', 'Tel number length < 10'];
  var tel = '', num = str.substr(-7),
      code = str.substr(-10, 3),
      coCode = '';
  if(l>10) {
    coCode = '+' + str.substr(0, (l-10) );
  }
  tel = coCode +' ('+ code +') '+ num;
  return ['succes', tel];
}
console.log(validTel('+1 [223] 123.45.67'));

Antwoord 17

Deze functie werkte goed voor ons:

let isPhoneNumber = input => {
  try {
    let ISD_CODES = [93, 355, 213, 1684, 376, 244, 1264, 672, 1268, 54, 374, 297, 61, 43, 994, 1242, 973, 880, 1246, 375, 32, 501, 229, 1441, 975, 591, 387, 267, 55, 246, 1284, 673, 359, 226, 257, 855, 237, 1, 238, 1345, 236, 235, 56, 86, 61, 61, 57, 269, 682, 506, 385, 53, 599, 357, 420, 243, 45, 253, 1767, 1809, 1829, 1849, 670, 593, 20, 503, 240, 291, 372, 251, 500, 298, 679, 358, 33, 689, 241, 220, 995, 49, 233, 350, 30, 299, 1473, 1671, 502, 441481, 224, 245, 592, 509, 504, 852, 36, 354, 91, 62, 98, 964, 353, 441624, 972, 39, 225, 1876, 81, 441534, 962, 7, 254, 686, 383, 965, 996, 856, 371, 961, 266, 231, 218, 423, 370, 352, 853, 389, 261, 265, 60, 960, 223, 356, 692, 222, 230, 262, 52, 691, 373, 377, 976, 382, 1664, 212, 258, 95, 264, 674, 977, 31, 599, 687, 64, 505, 227, 234, 683, 850, 1670, 47, 968, 92, 680, 970, 507, 675, 595, 51, 63, 64, 48, 351, 1787, 1939, 974, 242, 262, 40, 7, 250, 590, 290, 1869, 1758, 590, 508, 1784, 685, 378, 239, 966, 221, 381, 248, 232, 65, 1721, 421, 386, 677, 252, 27, 82, 211, 34, 94, 249, 597, 47, 268, 46, 41, 963, 886, 992, 255, 66, 228, 690, 676, 1868, 216, 90, 993, 1649, 688, 1340, 256, 380, 971, 44, 1, 598, 998, 678, 379, 58, 84, 681, 212, 967, 260, 263],
      //extract numbers from string
      thenum = input.match(/[0-9]+/g).join(""),
      totalnums = thenum.length,
      last10Digits = parseInt(thenum) % 10000000000,
      ISDcode = thenum.substring(0, totalnums - 10);
    //phone numbers are generally of 8 to 16 digits
    if (totalnums >= 8 && totalnums <= 16) {
      if (ISDcode) {
        if (ISD_CODES.includes(parseInt(ISDcode))) {
          return true;
        } else {
          return false;
        }
      } else {
        return true;
      }
    }
  } catch (e) {}
  return false;
}
console.log(isPhoneNumber('91-9883208806'));

Antwoord 18

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

Het teken ?geeft aan dat de voorgaande groep nul of één keer moet worden gevonden. De groep (-|\s)komt overeen met een -of een |-teken.


Antwoord 19

Ik ben het ermee eens dat het valideren van telefoonnummers een moeilijke taak is.
Wat betreft dit specifieke probleem zou ik de regex veranderen van

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)\d{4}$/

naar

/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/

aangezien het enige extra element dat overbodig wordt, het laatste streepje/spatie is.


Antwoord 20

Als u een invoertag gebruikt, dan zal deze code u helpen. Ik schrijf deze code zelf en ik denk dat dit een zeer goede manier is om in invoer te gebruiken. maar u kunt het wijzigen met uw indeling. Het zal de gebruiker helpen om het formaat op de invoertag te corrigeren.

$("#phone").on('input', function() {  //this is use for every time input change.
        var inputValue = getInputValue(); //get value from input and make it usefull number
        var length = inputValue.length; //get lenth of input
        if (inputValue < 1000)
        {
            inputValue = '1('+inputValue;
        }else if (inputValue < 1000000) 
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, length);
        }else if (inputValue < 10000000000) 
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, length);
        }else
        {
            inputValue = '1('+ inputValue.substring(0, 3) + ')' + inputValue.substring(3, 6) + '-' + inputValue.substring(6, 10);
        }       
        $("#phone").val(inputValue); //correct value entered to your input.
        inputValue = getInputValue();//get value again, becuase it changed, this one using for changing color of input border
       if ((inputValue > 2000000000) && (inputValue < 9999999999))
      {
          $("#phone").css("border","black solid 1px");//if it is valid phone number than border will be black.
      }else
      {
          $("#phone").css("border","red solid 1px");//if it is invalid phone number than border will be red.
      }
  });
    function getInputValue() {
         var inputValue = $("#phone").val().replace(/\D/g,'');  //remove all non numeric character
        if (inputValue.charAt(0) == 1) // if first character is 1 than remove it.
        {
            var inputValue = inputValue.substring(1, inputValue.length);
        }
        return inputValue;
}

Antwoord 21

Ik wilde alleen een oplossing toevoegen die specifiek is bedoeld voor het selecteren van niet-lokale telefoonnummers (type 800 en 900).

(\+?1[-.(\s]?|\()?(900|8(0|4|5|6|7|8)\3+)[)\s]?[-.\s]?\d{3}[-.\s]?\d{4}

Antwoord 22

Probeer deze js-functie.
Retourneert waar als het overeenkomt en onwaar als het mislukt
Ref

function ValidatePhoneNumber(phone) {
        return /^\+?([0-9]{2})\)?[-. ]?([0-9]{4})[-. ]?([0-9]{4})$/.test(phone);
}

Antwoord 23

Eenvoudige reguliere expressie: /\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g

Bekijk het formaat, hoop dat het werkt :
444-555-1234
f:246.555.8888
m:1235554567


Antwoord 24

\\(?\d{3}\\)?([\-\s\.])?\d{3}\1?\d{4}

Dit valideert elk telefoonnummer met variabele notatie:

\\(?\d{3}\\)?zoekt naar 3 cijfers tussen haakjes of niet.

([\-\s\.])?vindt een van deze scheidingstekens of niet

\d{3}vindt 3 cijfers

\1gebruikt het eerste overeenkomende scheidingsteken – dit zorgt ervoor dat de scheidingstekens hetzelfde zijn. Dus (000) 999-5555 zal hier niet valideren omdat er een scheidingsteken voor spatie en streepje is, dus verwijder gewoon de “\1” en vervang deze door het sub-scheidingsteken (als u dit doet, worden ook niet-standaard formaten gevalideerd). U moet echter toch formatteringshints gebruiken voor gebruikersinvoer.

\d{4}vindt 4 cijfers

Valideert:

  • (000) 999 5555
  • (000)-999-5555
  • (000).999.5555
  • (000) 999-5555
  • (000)9995555
  • 000 999 5555
  • 000-999-5555
  • 000.999.5555
  • 0009995555

BTW dit is voor JavaScript en dus voor dubbele escapes.


Antwoord 25

probeer dit

/^[\+]?\d{2,}?[(]?\d{2,}[)]?[-\s\.]?\d{2,}?[-\s\.]?\d{2,}[-\s\.]?\d{0,9}$/im

geldige formaten:

  1. (123) 456-7890
  2. (123)456-7890
  3. 123-456-7890
  4. 123.456.7890
  5. 1234567890
  6. +31636363634
  7. +3(123) 123-12-12
  8. +3(123)123-12-12
  9. +3(123)1231212
  10. +3(123) 12312123
  11. 075-63546725

Antwoord 26

Negeer alles behalve cijfers.

Dit is wat ik gebruik:

// USA phones should contain at least 10 digits. For Ukrainian phones it's OK to have only 9 digits, without leading 0 and country code prefix: [+380] 88 888-88-88.
String.prototype.isValidPhone = function(digitsCount) {
  var str = this.trim().match(/\d/g);
  return str && str.length >= (digitsCount || 10); // default is at least 10 digits
}

Antwoord 27

Ik heb die van @marty genomen en deze een beetje aangepast om meer gevallen op te vangen:

/^[\+]?([0-9][\s]?|[0-9]?)([(][0-9]{3}[)][\s]?|[0-9]{3}[-\s\.]?)[0-9]{3}[-\s\.]?[0-9]{4,6}$/im

Geldige indelingen:

  1. +1 123 4567890
  2. +11234567890
  3. +1(123)4567890
  4. +1(123)456-7890
  5. +1 (123) 456-7890
  6. +1 (123)456 7890
  7. +1 123 456-7890
  8. +1 123 456 7890
  9. +1 123-456-7890
  10. 123-456-7890
  11. 123 456-7890
  12. 123 456 7890
  13. 123 4567890
  14. 1234567890

Other episodes