জাভাস্ক্রিপ্টে কোনও মার্কিন ফোন নম্বর পুনরায় ফর্ম্যাট করতে নিয়মিত প্রকাশ ression


97

আমি জাভাস্ক্রিপ্টে প্রদর্শনের জন্য একটি ফোন নম্বর পুনরায় ফর্ম্যাট করতে চাই (প্রতিস্থাপন, বৈধকরণ নয় - বৈধকরণের জন্য অনেকগুলি রেফারেন্স রয়েছে)। এখানে কিছু উপাত্তের উদাহরণ রয়েছে:

  • 123 4567890
  • (123) 456-7890
  • (123)456-7890
  • 123 456 7890
  • 123.456.7890
  • (ফাঁকা / নাল)
  • 1234567890

এটি করার জন্য কোনও নিয়মিত অভিব্যক্তি ব্যবহার করার কোনও সহজ উপায় আছে কি? আমি এটি করার সর্বোত্তম উপায়ের সন্ধান করছি। একটি ভাল উপায় আছে কি?

আমি নিম্নলিখিতটিতে নম্বরটি পুনরায় ফর্ম্যাট করতে চাই: (123) 456-7890


4
এবং এর মধ্যে কোনটি আপনার টার্গেট ফর্ম্যাট?
পর্যন্ত 11:51

এটির একটি: (123) 456-7890
ম্যাট কে

4
আমি বলব যে সমস্ত অ-অঙ্কের অক্ষরগুলি সরিয়ে ফেলুন তবে তিনটি সাবস্ট্রিং নেবে।
ওয়াইজগুই

4
@ জ্ঞানগুয়ে দয়া করে উত্তর হিসাবে পোস্ট করুন (উদাহরণ সহ), যেহেতু ওপিকে আসলেই এটি করা উচিত।
ব্রায়ান ড্রিসকোল

4
আপনাকে স্বীকৃত ফর্ম্যাটগুলির প্রত্যেকটি কীভাবে লক্ষ্য বিন্যাসে মানচিত্রের উল্লেখ করতে হবে, যা ইনপুটটি বাতিল হলে তা মোটেই স্পষ্ট নয়। যদি না আপনি অতিরিক্ত শর্তযুক্ত কেস ব্যবহার করতে ইচ্ছুক না হন যদি না কেস আউট।
জন

উত্তর:


240

ধরে নিচ্ছেন আপনি " (123) 456-7890" ফর্ম্যাটটি চান :

function formatPhoneNumber(phoneNumberString) {
  var cleaned = ('' + phoneNumberString).replace(/\D/g, '')
  var match = cleaned.match(/^(\d{3})(\d{3})(\d{4})$/)
  if (match) {
    return '(' + match[1] + ') ' + match[2] + '-' + match[3]
  }
  return null
}

এখানে এমন একটি সংস্করণ যা +1international চ্ছিক আন্তর্জাতিক কোডকে অনুমতি দেয় :

function formatPhoneNumber(phoneNumberString) {
  var cleaned = ('' + phoneNumberString).replace(/\D/g, '')
  var match = cleaned.match(/^(1|)?(\d{3})(\d{3})(\d{4})$/)
  if (match) {
    var intlCode = (match[1] ? '+1 ' : '')
    return [intlCode, '(', match[2], ') ', match[3], '-', match[4]].join('')
  }
  return null
}
formatPhoneNumber('+12345678900') // => "+1 (234) 567-8900"
formatPhoneNumber('2345678900')   // => "(234) 567-8900"

4
নিখুঁত; ধন্যবাদ! যাইহোক, আমি এই ফাংশন যোগ return (!m) ? nullকরার return (!m) ? ""পরে পরিবর্তন ।
ম্যাট কে

4
কীভাবে কোনও সমস্যার কাছে যাওয়া যায় তার একটি দুর্দান্ত পাঠ। আমি কীভাবে সম্ভাব্য সমস্ত মামলার সাথে মেলে ধরতে চেষ্টা করছিলাম - আপনি অপ্রাসঙ্গিক দূর করে দেখুন কোনও মিল আছে কিনা তা দেখুন। খুব সুন্দর.
Jkleg

4
অবগতির জন্য ভালো + 1555-555-5555 সংখ্যার জন্য কাজ করে না
উইল

'' + phoneNumberStringএর মতোই phoneNumberString... এটি ইতিমধ্যে একটি স্ট্রিং।
ইয়ংগুন

@ ইয়ংগুন যদি না কেউ কোনও সংখ্যার সাথে ফাংশনটি কল করে, যেমনformatPhoneNumber(8001231234)
ম্যায়ারিক্স

32

সম্ভাব্য সমাধান:

function normalize(phone) {
    //normalize string and remove all unnecessary characters
    phone = phone.replace(/[^\d]/g, "");

    //check if number length equals to 10
    if (phone.length == 10) {
        //reformat and return phone number
        return phone.replace(/(\d{3})(\d{3})(\d{4})/, "($1) $2-$3");
    }

    return null;
}

var phone = '(123)4567890';
phone = normalize(phone); //(123) 456-7890

27

var x = '301.474.4062';
    
x = x.replace(/\D+/g, '')
     .replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');

alert(x);


4
ধন্যবাদ শান, আমি আপনার সংক্ষিপ্ত সাধারণ ইনলাইন সমাধানটি পছন্দ করি।
ব্যবহারকারী 752746

4
এর জন্য ধন্যবাদ! x = x.replace(/[^\d]+/g, '') .replace(/(\d{1})(\d{3})(\d{3})(\d{4})/, '+$1 ($2) $3-$4');ফোন
গ্রেগ এ

ধন্যবাদ! এটি কেবল আমার প্রয়োজন
অ্যালবার্ট হিডালগো

8

এই উত্তরটি ম্যারিক্সের উত্তর থেকে ধার নিয়েছে। এটি প্রাথমিকভাবে পৃথক যে এটি আংশিকভাবে প্রবেশ করা ফোন নম্বরগুলি গ্রহণ করে এবং প্রবেশ করা অংশগুলিকে ফর্ম্যাট করে।

phone = value.replace(/\D/g, '');
const match = phone.match(/^(\d{1,3})(\d{0,3})(\d{0,4})$/);
if (match) {
  phone = `${match[1]}${match[2] ? ' ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}`;
}
return phone

উত্স পোস্টার থেকে পছন্দসই বিন্যাসে যুক্ত করে এটি আপনার টাইপ করার মতো কাজ করে। 1.5 ঘন্টা অনুসন্ধানের পরে, আমি খুশি আমি এটি চেষ্টা করেছিলাম!
ছত্রাকসংস্থান

আমি যদি ক্ষেত্রের কোডের আশেপাশে প্রথম বন্ধনী যুক্ত করি তবে এটি যদি সহায়তা করে:(${match[1]}${match[2] ? ') ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}
পিটার হোলিংসওয়ার্থ

আসলে সমস্যাটি তখন আপনি '-' বা মিড-স্ট্রিংয়ের স্থান থেকে ব্যাকস্পেস করতে পারবেন না। ব্যবহারকারী যখন ব্যাকস্প্যাক করছে তখন আপনাকে পুনরায় ফর্ম্যাটিং প্রতিরোধ করতে হবে (উদাহরণস্বরূপ newstring.length < oldstring.lengthবা কার্সারের অবস্থানটি ট্র্যাক করতে এবং ব্যবহারকারী যখন এই ডিলিমিটারগুলির ঠিক পিছনে পিছনে রয়েছে যেমনif (cursorPosition === 4 && numericString.length > 3)
পিটার হোলিংসওয়ার্থ

আমার প্রতিক্রিয়া কোডটিতে আমি অভ্যন্তরীণভাবে কেবল প্রবেশ করা নম্বর সংরক্ষণ করে এবং পরে ক্ষেত্রের মধ্যে কী স্থাপন করা হয় তা ফর্ম্যাট করে এটিকে ঘিরে। সুতরাং ব্যাকস্পেসটি প্রকৃত মানটিতে পূর্ববর্তী অক্ষরটি সরিয়ে দেয়, প্রদর্শিত মানটি নয়।
ডেভিড বাউকুম

5

আমি মার্কিন সংখ্যাগুলি ফর্ম্যাট করতে এই ফাংশনটি ব্যবহার করছি।

function formatUsPhone(phone) {

    var phoneTest = new RegExp(/^((\+1)|1)? ?\(?(\d{3})\)?[ .-]?(\d{3})[ .-]?(\d{4})( ?(ext\.? ?|x)(\d*))?$/);

    phone = phone.trim();
    var results = phoneTest.exec(phone);
    if (results !== null && results.length > 8) {

        return "(" + results[3] + ") " + results[4] + "-" + results[5] + (typeof results[8] !== "undefined" ? " x" + results[8] : "");

    }
    else {
         return phone;
    }
}

এটি মার্কিন ফোন নম্বর লেখার প্রায় সমস্ত কল্পনাপ্রসূত উপায় গ্রহণ করে। ফলাফলটি (987) 654-3210 x123 এর একটি স্ট্যান্ডার্ড আকারে ফর্ম্যাট করা হয়েছে


3

পিছনে চিন্তা

প্রথম "1" উপেক্ষা করে সর্বশেষ সংখ্যাগুলি (10 অবধি) নিন।

function formatUSNumber(entry = '') {
  const match = entry
    .replace(/\D+/g, '').replace(/^1/, '')
    .match(/([^\d]*\d[^\d]*){1,10}$/)[0]
  const part1 = match.length > 2 ? `(${match.substring(0,3)})` : match
  const part2 = match.length > 3 ? ` ${match.substring(3, 6)}` : ''
  const part3 = match.length > 6 ? `-${match.substring(6, 10)}` : ''    
  return `${part1}${part2}${part3}`
}

টাইপ করার সাথে সাথে উদাহরণস্বরূপ ইনপুট / আউটপুট

formatUSNumber('+1333')
// (333)

formatUSNumber('333')
// (333)

formatUSNumber('333444')
// (333) 444

formatUSNumber('3334445555')
// (333) 444-5555

1
var numbers = "(123) 456-7890".replace(/[^\d]/g, ""); //This strips all characters that aren't digits
if (numbers.length != 10) //wrong format
    //handle error
var phone = "(" + numbers.substr(0, 3) + ") " + numbers.substr(3, 3) + "-" + numbers.substr(6); //Create format with substrings

0

এখানে একটি যা এক্সটেনশন সহ ফোন নম্বর এবং ফোন নম্বর উভয়ই গ্রহণ করবে।

function phoneNumber(tel) {
var toString = String(tel),
    phoneNumber = toString.replace(/[^0-9]/g, ""),
    countArrayStr = phoneNumber.split(""),
    numberVar = countArrayStr.length,
    closeStr = countArrayStr.join("");
if (numberVar == 10) {
    var phone = closeStr.replace(/(\d{3})(\d{3})(\d{4})/, "$1.$2.$3"); // Change number symbols here for numbers 10 digits in length. Just change the periods to what ever is needed.
} else if (numberVar > 10) {
    var howMany = closeStr.length,
        subtract = (10 - howMany),
        phoneBeginning = closeStr.slice(0, subtract),
        phoneExtention = closeStr.slice(subtract),
        disX = "x", // Change the extension symbol here
        phoneBeginningReplace = phoneBeginning.replace(/(\d{3})(\d{3})(\d{4})/, "$1.$2.$3"), // Change number symbols here for numbers greater than 10 digits in length. Just change the periods and to what ever is needed. 
        array = [phoneBeginningReplace, disX, phoneExtention],
        afterarray = array.splice(1, 0, " "),
        phone = array.join("");

} else {
    var phone = "invalid number US number";
}
return phone;
}

phoneNumber("1234567891"); // Your phone number here

0

আপনি বৈধ ফোন নম্বরগুলি পরীক্ষা করতে এবং এগুলি স্বাভাবিক করার জন্য এই ফাংশনগুলি ব্যবহার করতে পারেন:

let formatPhone = (dirtyNumber) => {
 return dirtyNumber.replace(/\D+/g, '').replace(/(\d{3})(\d{3})(\d{4})/, '($1) $2-$3');
}

let isPhone = (phone) => {
   //normalize string and remove all unnecessary characters
   phone = phone.replace(/\D+/g, '');
   return phone.length == 10? true : false;
}

0

দৈর্ঘ্যে 4 টি সংখ্যা পর্যন্ত এক্সটেনশনের সমর্থন অন্তর্ভুক্ত করার জন্য আমি ডেভিড বাউকামের উত্তরকে প্রসারিত করেছি । এটিতে মূল প্রশ্নে অনুরোধ করা প্রথম বন্ধনীও অন্তর্ভুক্ত রয়েছে। ক্ষেত্রটি টাইপ করার সাথে সাথে এই ফর্ম্যাটিংটি কাজ করবে।

phone = phone.replace(/\D/g, '');
const match = phone.match(/^(\d{1,3})(\d{0,3})(\d{0,4})(\d{0,4})$/);
if (match) {
    phone = `(${match[1]}${match[2] ? ') ' : ''}${match[2]}${match[3] ? '-' : ''}${match[3]}${match[4] ? ' x' : ''}${match[4]}`;
}
return phone;

0

ব্যবহারকারী প্রায়শই সীমানা ছাড়িয়ে বিশেষত স্ট্রিংয়ের মাঝখানে থেকে ব্যাকস্পেস চালানোর চেষ্টা করে তবে এগুলির প্রায় সমস্তটিরই সমস্যা রয়েছে।

এখানে একটি জ্যাকুরি সমাধান রয়েছে যা এটি পরিচালনা করে এবং আপনার সম্পাদনা করার সাথে সাথে কার্সারটি সঠিক জায়গায় থাকে তা নিশ্চিত করে:

//format text input as phone number (nnn) nnn-nnnn
$('.myPhoneField').on('input', function (e){
    var $phoneField = e.target;
    var cursorPosition = $phoneField.selectionStart;
    var numericString = $phoneField.value.replace(/\D/g, '').substring(0, 10);

    // let user backspace over the '-'
    if (cursorPosition === 9 && numericString.length > 6) return;

    // let user backspace over the ') '
    if (cursorPosition === 5 && numericString.length > 3) return;
    if (cursorPosition === 4 && numericString.length > 3) return;

    var match = numericString.match(/^(\d{1,3})(\d{0,3})(\d{0,4})$/);
    if (match) {
        var newVal = '(' + match[1];
        newVal += match[2] ? ') ' + match[2] : '';
        newVal += match[3] ? '-' + match[3] : '';

        // to help us put the cursor back in the right place
        var delta = newVal.length - Math.min($phoneField.value.length, 14);      
        $phoneField.value = newVal;
        $phoneField.selectionEnd = cursorPosition + delta;
    } else {
        $phoneField.value = '';        
    }
})

0

উপরের সমাধানগুলি সর্বোত্তম especially এই সমাধানটি মৌলিক (আমি রেজেক্স ওয়ার্ল্ডের একটি শিক্ষানবিশ) এবং মার্কিন ফোন নম্বরগুলি মাথায় রেখে ডিজাইন করেছি এবং কেবল কয়েকটি বিন্যাসের অক্ষরযুক্ত 10 টি সংখ্যার স্ট্রিংগুলির জন্য কেবল কার্যকর বা কোনও বিন্যাসের অক্ষর নেই (কেবল 10 সংখ্যা) )। এই হিসাবে আমি কেবলমাত্র আধা-স্বয়ংক্রিয় অ্যাপ্লিকেশনের জন্য এই সমাধানটি পুনরায় সংশোধন করব। অক্ষর বিন্যাস ছাড়াই আমি ব্যক্তিগতভাবে সংখ্যাগুলি কেবলমাত্র 10 নম্বর হিসাবে সংরক্ষণ করতে পছন্দ করি, তবে ফোন নম্বরগুলিকে সাধারণ বিন্যাস এবং অ্যাপ্লিকেশন / ফোনগুলিতে ইচ্ছামত তাত্ক্ষণিকভাবে স্বীকৃতি দেবে রূপান্তর করতে বা পরিষ্কার করতে সক্ষম হতে চাই।

আমি এই পোস্টটি জুড়ে এমন কিছু সন্ধান করলাম যাতে আমি টেক্সট ক্লিনার অ্যাপ্লিকেশনটি ব্যবহার করতে পারি যার মধ্যে পিসিআরই রেজেক্স ক্ষমতা রয়েছে (তবে জাভা ফাংশন নেই)। আমি এখানে এমন লোকদের জন্য পোস্ট করব যারা একটি সাধারণ খাঁটি রেইগেক্স সমাধান ব্যবহার করতে পারে যা বিভিন্ন পাঠ্য সম্পাদক, ক্লিনার, প্রসারণকারী, এমনকি কিছু ক্লিপবোর্ড পরিচালকের ক্ষেত্রেও কাজ করতে পারে। আমি ব্যক্তিগতভাবে সাব্লাইম এবং টেক্সটসোপ ব্যবহার করি। এই সমাধানটি টেক্সট সোপটির জন্য তৈরি করা হয়েছিল কারণ এটি মেনু বারে থাকে এবং একটি ড্রপ-ডাউন মেনু সরবরাহ করে যেখানে আপনি কার্সার দ্বারা নির্বাচিত বা ক্লিপবোর্ডে কী রয়েছে তা নিয়ে টেক্সট ম্যানিপুলেশন ক্রিয়াকে ট্রিগার করতে পারেন।

আমার পদ্ধতির মূলত দুটি প্রতিস্থাপন / অনুসন্ধান এবং পুনরায় স্থান পরিবর্তন করা। প্রতিটি প্রতিস্থাপন অনুসন্ধান এবং প্রতিস্থাপনের জন্য দুটি পুনরায় জড়িত রয়েছে, একটি অনুসন্ধানের জন্য এবং একটি প্রতিস্থাপনের জন্য।

প্রতিস্থাপন / অনুসন্ধান এবং প্রতিস্থাপন # 1

  • প্রথম প্রতিস্থাপন / অনুসন্ধান এবং স্ট্রিপগুলি অ-সংখ্যাগত সংখ্যাগুলি অন্যথায় 10-সংখ্যার সংখ্যা থেকে 10-সংখ্যার স্ট্রিংয়ে প্রতিস্থাপন করে।

প্রথম প্রতিস্থাপন / অনুসন্ধান রেজেক্স:\D

  • এই অনুসন্ধান স্ট্রিং সমস্ত অক্ষর যে ম্যাচ না একটি অঙ্ক।

প্রথম উপকল্পন / প্রতিস্থাপন Regex: "" (কিছুই না এমনকি একটি স্থান)

  • বিকল্প ক্ষেত্রটি পুরোপুরি ফাঁকা ছেড়ে যান, ফাঁকা স্থান সহ কোনও সাদা স্থান থাকতে হবে না। এর ফলে সমস্ত মিলে যাওয়া অ-অঙ্কের অক্ষর মুছে ফেলা হবে। এই ক্রিয়াকলাপের আগে আপনার 10 সংখ্যার + ফর্ম্যাটিং অক্ষরগুলি নিয়ে যাওয়া উচিত ছিল এবং 10 সংখ্যার সান বিন্যাসকরণের অক্ষরগুলি নিয়ে এসেছিল।

প্রতিস্থাপন / অনুসন্ধান এবং প্রতিস্থাপন # 2

  • অপারেশনটির দ্বিতীয় বিকল্প / সন্ধান এবং প্রতিস্থাপন অনুসন্ধানের অংশটি অঞ্চল কোডের জন্য গ্রুপগুলি $1, তিন সংখ্যার দ্বিতীয় সেটের জন্য একটি ক্যাপচার গ্রুপ এবং $2চারটি সংখ্যার শেষ সেটের জন্য শেষ ক্যাপচার গ্রুপকে ক্যাপচার করে $3। অপারেশনের বিকল্প অংশের জন্য রেজেক্স মার্কিন যুক্তরাষ্ট্রে নম্বর নম্বর বিন্যাসের গোষ্ঠীর মধ্যে ফর্ম্যাটিং সন্নিবেশ করায়।

দ্বিতীয় প্রতিস্থাপন / অনুসন্ধান রেজেক্স:(\d{3})(\d{3})(\d{4})

দ্বিতীয় প্রতিস্থাপন / রিজেক্স প্রতিস্থাপন :\($1\) $2\-$3

  • ব্যাকস্ল্যাশ \বিশেষ অক্ষর পালাতে (, ), (<-whitespace), এবং -যেহেতু আমরা ক্যাপচার দলে দলে আমাদের বন্দী সংখ্যার মধ্যে তাদের ঢোকাতে হয় $1, $2, & $3ইউএস ফোন নম্বর বিন্যাস উদ্দেশ্যে।

  • টেক্সটসোপে আমি একটি কাস্টম ক্লিনার তৈরি করেছি যার মধ্যে দুটি প্রতিস্থাপন অপারেশন ক্রিয়া অন্তর্ভুক্ত রয়েছে, তাই বাস্তবে এটি কোনও স্ক্রিপ্ট কার্যকর করার অনুরূপ মনে হয়। আমি নিশ্চিত যে এই সমাধানটি উন্নত হতে পারে তবে আমি আশা করি জটিলতাটি খানিকটা উপরে উঠে যাবে। যদি কেউ এটি যুক্ত করতে চায় তবে এই সমাধানটির একটি উন্নত সংস্করণটিকে শেখার অভিজ্ঞতা হিসাবে স্বাগত জানানো হবে।


-2

মার্কিন ফোন নম্বরগুলির জন্য

/^\(?(\d{3})\)?[- ]?(\d{3})[- ]?(\d{4})$/

আসুন এই নিয়মিত প্রকাশটি আরও ছোট ছোট টুকরো টুকরো করে ভাগ করে নেওয়া সহজ understand

  • /^\(?: এর অর্থ হল যে ফোন নম্বরটি একটি anচ্ছিক দিয়ে শুরু হতে পারে (
  • (\d{3}): (Alচ্ছিকর পরে অবশ্যই 3 টি সংখ্যা হবে। যদি ফোন নম্বরটিতে একটি না থাকে তবে (এটি অবশ্যই 3 টি সংখ্যা দিয়ে শুরু করা উচিত। যেমন (308বা 308
  • \)?: এর অর্থ হ'ল )প্রথম 3 সংখ্যার পরে ফোন নম্বরটিতে anচ্ছিক থাকতে পারে ।
  • [- ]?: এরপরে ফোন নম্বরটিতে উপস্থিত থাকলে বা প্রথম 3 ডিজিটের পরে একটি optionচ্ছিক হাইফেন ( -) থাকতে পারে )
  • (\d{3}): তারপরে অবশ্যই আরও তিনটি সংখ্যা হবে। যেমন (308)-135বা 308-135বা308135
  • [- ]?: 3 ডিজিটের দ্বিতীয় সেটটির পরে ফোন নম্বরটিতে আরও একটি optionচ্ছিক হাইফেন ( -) থাকতে পারে। যেমন (308)-135-বা 308-135-বা308135-
  • (\d{4})$/: অবশেষে, ফোন নম্বরটি অবশ্যই চার অঙ্কের সাথে শেষ হবে। যেমন (308)-135-7895বা 308-135-7895বা 308135-7895বা 3081357895

    তথ্যসূত্র:

http://www.zparacha.com/phone_number_regex/


4
অন্য ওয়েবসাইট থেকে কাপড় অনুলিপি করা ও তারপর লিংক পোস্ট করা বেশ খারাপ আচরণ: zparacha.com/phone_number_regex
পর্যন্ত Helge

4
আমি দুঃখিত, আমাদের লিঙ্কটি পোস্ট করতে হবে এমন আমার ধারণা ছিল না। আমি ভেবেছিলাম আমাদের পোস্ট করা প্রশ্নের উত্তর দিতে হবে।
বেবু

4
এটা কখনোই আপনার নিজের মত অন্য কারো কাজ বানাতে করা ঠিক। পরের বারের জন্য এটি মনে রাখবেন যে লিঙ্কগুলি পোস্ট করার ক্ষেত্রে কোনও ভুল নেই, তবে অনুলিপি করা (বিশেষত কোনও লিঙ্ক সরবরাহ না করে) নয়। এবং আপনার উত্তর সবসময় সম্পাদনা করার বিকল্প থাকে have
2:25

ডাউনভোটেড কারণ লেখকের অনুরোধ হিসাবে ফোন নম্বরটি কীভাবে প্রতিস্থাপন করা যায় সে বিষয়ে লেখক উত্তর দেয়নি ।
ব্রায়ানএইচভিবি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.