পিএইচপি-তে ফোন নম্বর ফর্ম্যাট করা


103

আমি একটি এসএমএস অ্যাপে কাজ করছি এবং প্রেরকের ফোন নম্বরটি +11234567890 থেকে 123-456-7890 এ রূপান্তর করতে সক্ষম হওয়া দরকার যাতে এটি মাইএসকিউএল ডাটাবেসে রেকর্ডের সাথে তুলনা করা যায় ।

নম্বরগুলি সাইটে অন্য কোথাও ব্যবহারের জন্য পরবর্তী ফর্ম্যাটে সংরক্ষণ করা হয় এবং আমি বরং এই ফর্ম্যাটটি পরিবর্তন করব না কারণ এর জন্য প্রচুর কোড সংশোধন করা প্রয়োজন।

আমি পিএইচপি দিয়ে এটি সম্পর্কে কীভাবে যাব?

ধন্যবাদ!


13
আহহহ .... নুওউও .... আপনি কেন ফোন নম্বর এভাবে স্টোর করছেন !? স্ট্রিং হিসাবে? খারাপ খারাপ খারাপ! আপনার সেগুলি বড়
আকারের অন্তর্নির্মিত

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

4
@ নাইটমিকু - এটি করার 100% ভুল উপায় ... আপনার একটি পূর্ণসংখ্যার হিসাবে সংরক্ষণ করা উচিত এবং প্রদর্শনের জন্য ফর্ম্যাট করে এমন একটি পুনরায় ব্যবহারযোগ্য ফাংশন থাকা উচিত
sethvargo

231
সংগ্রহস্থলের স্থান বাঁচানোর জন্য পূর্ণসংখ্যক হিসাবে ফোন নম্বর সংরক্ষণ করা একটি ভয়াবহ ধারণা is ফোন নম্বরগুলি সাধারণ অর্থে এমন কোনও সংখ্যা নয় যে আপনি তাদের উপর গণিত করবেন। এই মুহুর্তে আপনাকে কোনও মার্কিন নির্দিষ্ট বিন্যাসের বাইরে নম্বরগুলি সংরক্ষণ করতে হবে যেখানে 0 টি দিয়ে সংখ্যাটি শুরু হতে পারে আপনি সমস্যার সম্মুখীন হবেন। স্ট্রিং হিসাবে এই তথ্য সংরক্ষণ করা ভাল।
চার্লস স্প্রেবেরি

4
@ নাইটমিকু যদি এটি স্ট্রিং হিসাবে সংরক্ষণের বিষয়ে আরও ভাল অনুভব করে তবে দুর্দান্ত জোন স্কিট নেতৃস্থানীয় শূন্য সমস্যার জন্য পূর্ণসংখ্যা হিসাবে সংরক্ষণ না করার জন্য বলে। stackoverflow.com/a/3483166/746010
চার্লস স্প্রেবেরি

উত্তর:


109
$data = '+11234567890';

if(  preg_match( '/^\+\d(\d{3})(\d{3})(\d{4})$/', $data,  $matches ) )
{
    $result = $matches[1] . '-' .$matches[2] . '-' . $matches[3];
    return $result;
}

4
আন্তর্জাতিক সংখ্যাগুলির সম্ভাব্য স্থান এবং অন্যান্য ফর্ম্যাটগুলি ক্যাপচার করতে: / ^ (\ +? \ D {1,2}?) [.-]? (? (? (\ D {3})))? [.-]? (\ D) {3}) [.-]? (\ D {4}) $ /
টেকনিএক্স

4
@ স্টুটি আপনার ভুল, $ ম্যাচগুলি [0] হ'ল সম্পূর্ণ মিলিত প্যাটার্ন পাঠ্য, তবে আপনাকে সেভাবে ব্যবহার করার আগে অ্যারে_শিফ্ট ($ ম্যাচগুলি) করতে হবে।
আলেকজান্দ্রে রেইস রিবেইরো

আউটপুট এ এটি বিন্যাস করা দ্রুত হবে? ব্যবহার করছেন sprintfবা `printf``? কেউ দয়া করে আমাকে ব্যাখ্যা করুন। আমি কেবল মার্কিন যুক্তরাষ্ট্রে ফোন নম্বর নিয়ে কাজ করছি এবং সাবস্ট্রিং ব্যবহার করে আউটপুট ফাংশন দিয়ে এগুলি চালানো সর্বোত্তম পদ্ধতি বলে মনে হয় না।
রাফায়েল

আমি মনে করি এসও এর মন্তব্যে ডাউনভোটগুলি অন্তর্ভুক্ত করা উচিত। @ স্টুটির মন্তব্য বিভ্রান্তিকর।
পিটারচৌলা

4
আমি আমার ছোট, প্রি-টিডিডি দিবসের জন্য এত বছর আগে ভুল মন্তব্য পোস্ট করার জন্য ক্ষমাপ্রার্থী। ভবিষ্যতে আরও ভাল করার প্রতিশ্রুতি দিচ্ছি। আপনার উল্লেখ করা মন্তব্যটি মুছে ফেলা হয়েছে বলে মনে হচ্ছে। সবকিছু ঠিক আছে. শুভ ছুটির দিন.
স্টুটি

165

এটি একটি মার্কিন ফোন ফর্ম্যাটর যা বর্তমানের যে কোনও উত্তরের চেয়ে সংখ্যার বেশি সংস্করণে কাজ করে।

$numbers = explode("\n", '(111) 222-3333
((111) 222-3333
1112223333
111 222-3333
111-222-3333
(111)2223333
+11234567890
    1-8002353551
    123-456-7890   -Hello!
+1 - 1234567890 
');


foreach($numbers as $number)
{
    print preg_replace('~.*(\d{3})[^\d]{0,7}(\d{3})[^\d]{0,7}(\d{4}).*~', '($1) $2-$3', $number). "\n";
}

এবং এখানে রেজেক্সের একটি ভাঙ্গন রয়েছে:

Cell: +1 999-(555 0001)

.*          zero or more of anything "Cell: +1 "
(\d{3})     three digits "999"
[^\d]{0,7}  zero or up to 7 of something not a digit "-("
(\d{3})     three digits "555"
[^\d]{0,7}  zero or up to 7 of something not a digit " "
(\d{4})     four digits "0001"
.*          zero or more of anything ")"

আপডেট হয়েছে: {0,7}পরিবর্তে 11 মার্চ, 2015 ব্যবহার করুন{,7}


যদি ফোন নম্বরটির একটি এক্সটেনশন থাকে?
SpYk3HH

4
ভাল কথা - এক্সটেনশনগুলি কীভাবে বিশ্বজুড়ে দেখায় তার কয়েকটি উদাহরণ রয়েছে? প্রোবালির মতো কিছু ~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})(?:[ \D#\-]*(\d{3,6}))?.*~
জিওনক্রস

4
আমার ওয়েবসাইট ব্যবহারকারীরা যদি ক্ষেত্রের কোডটি রেখে দেয় তবে কী হবে?
skibulk

আমরা কি রেইজেক্সের বিভিন্ন অংশগুলি করছে তার একটি ব্রেকডাউন পেতে পারি (নীচে অন্য উত্তরে দেখানো হয়েছে)? অর্থাত্: (\d{3}) // 3 digits [\d]// অক্ষর নয় এমন একটি অক্ষর
রবার্থঅট্টিংগার

4
@ ওয়েসলিমার্চে নিয়মিত প্রকাশের সাথে মিল রেখে এখনই পরিবর্তন করার দরকার আছে বলে মনে {,7}হয় {0,7}। আমি কোড আপডেট করেছি।
শিওনক্রস

55

এই ফাংশনটি আন্তর্জাতিক (10+ ডিজিট), অ-আন্তর্জাতিক (10 ডিজিট) বা পুরাতন স্কুল (7 ডিজিট) ফোন নম্বরগুলিকে ফর্ম্যাট করবে। 10+, 10 বা 7 সংখ্যা ব্যতীত অন্য কোনও সংখ্যা অপরচঞ্চলিত থাকবে।

function formatPhoneNumber($phoneNumber) {
    $phoneNumber = preg_replace('/[^0-9]/','',$phoneNumber);

    if(strlen($phoneNumber) > 10) {
        $countryCode = substr($phoneNumber, 0, strlen($phoneNumber)-10);
        $areaCode = substr($phoneNumber, -10, 3);
        $nextThree = substr($phoneNumber, -7, 3);
        $lastFour = substr($phoneNumber, -4, 4);

        $phoneNumber = '+'.$countryCode.' ('.$areaCode.') '.$nextThree.'-'.$lastFour;
    }
    else if(strlen($phoneNumber) == 10) {
        $areaCode = substr($phoneNumber, 0, 3);
        $nextThree = substr($phoneNumber, 3, 3);
        $lastFour = substr($phoneNumber, 6, 4);

        $phoneNumber = '('.$areaCode.') '.$nextThree.'-'.$lastFour;
    }
    else if(strlen($phoneNumber) == 7) {
        $nextThree = substr($phoneNumber, 0, 3);
        $lastFour = substr($phoneNumber, 3, 4);

        $phoneNumber = $nextThree.'-'.$lastFour;
    }

    return $phoneNumber;
}

এটি দুর্দান্ত তবে আমি কেবল উল্লেখ করতে চাই যে অঞ্চল কোডের চারপাশে প্রথম বন্ধনীগুলি alচ্ছিক সংখ্যা বোঝায়। বেশিরভাগ এখতিয়ারগুলি এরিয়া কোডটি alচ্ছিক বিবেচনা করে না তাই সাধারণ হাইফেনের সাথে পৃথক করা আরও সঠিক।
ভিনসেন্ট

31

ধরে নিই যে আপনার ফোন নম্বরগুলিতে সর্বদা এই সঠিক বিন্যাস রয়েছে, আপনি এই স্নিপেটটি ব্যবহার করতে পারেন:

$from = "+11234567890";
$to = sprintf("%s-%s-%s",
              substr($from, 2, 3),
              substr($from, 5, 3),
              substr($from, 8));

শুধু প্রতিধ্বনি $ to var ... এটি ভালবাসুন, আমার জন্য কাজ করেছেন কেবল প্রিফেক্ট।
স্যামুয়েল রমজান

22

ফোন নম্বরগুলি শক্ত। আরও শক্তিশালী, আন্তর্জাতিক সমাধানের জন্য, আমি গুগলের লাইবফোনেম্বরের এই সু-রক্ষণাবেক্ষণ পিএইচপি পোর্টটি সুপারিশ করব লাইব্রেরির ।

এটি এর মতো ব্যবহার করে,

use libphonenumber\NumberParseException;
use libphonenumber\PhoneNumber;
use libphonenumber\PhoneNumberFormat;
use libphonenumber\PhoneNumberUtil;

$phoneUtil = PhoneNumberUtil::getInstance();

$numberString = "+12123456789";

try {
    $numberPrototype = $phoneUtil->parse($numberString, "US");

    echo "Input: " .          $numberString . "\n";
    echo "isValid: " .       ($phoneUtil->isValidNumber($numberPrototype) ? "true" : "false") . "\n";
    echo "E164: " .           $phoneUtil->format($numberPrototype, PhoneNumberFormat::E164) . "\n";
    echo "National: " .       $phoneUtil->format($numberPrototype, PhoneNumberFormat::NATIONAL) . "\n";
    echo "International: " .  $phoneUtil->format($numberPrototype, PhoneNumberFormat::INTERNATIONAL) . "\n";
} catch (NumberParseException $e) {
    // handle any errors
}

আপনি নিম্নলিখিত আউটপুট পাবেন:

Input: +12123456789
isValid: true
E164: +12123456789
National: (212) 345-6789
International: +1 212-345-6789

আমি E164সদৃশ চেকগুলির জন্য ফর্ম্যাটটি ব্যবহার করার পরামর্শ দেব । নম্বরটি আসলে মোবাইল নম্বর PhoneNumberUtil::getNumberType()কিনা (ব্যবহার করা ), অথবা এটি কোনও মার্কিন নম্বর (ব্যবহার করা PhoneNumberUtil::getRegionCodeForNumber()) কিনা তাও আপনি পরীক্ষা করতে পারেন ।

বোনাস হিসাবে, গ্রন্থাগারটি বেশ কয়েকটি ইনপুট পরিচালনা করতে পারে। উদাহরণস্বরূপ, যদি আপনি 1-800-JETBLUEউপরের কোডটি দিয়ে চালানো পছন্দ করেন তবে আপনি পাবেন

Input: 1-800-JETBLUE
isValid: true
E164: +18005382583
National: (800) 538-2583
International: +1 800-538-2583

নিয়াটো।

এটি মার্কিন যুক্তরাষ্ট্র ব্যতীত অন্যান্য দেশের জন্য ঠিক তত ভাল কাজ করে। parse()আর্গুমেন্টে কেবল আরেকটি আইএসও দেশের কোড ব্যবহার করুন ।


4
দুর্দান্ত লাইব্রেরি, তবে নোট করুন যে এটি 37 এমবি এবং 1500 ফাইল! আমার ক্ষেত্রে, আমার কাছে ফর্ম্যাট করার জন্য সীমিত সংখ্যক ফোন নম্বর রয়েছে, তাই আমি ঠিক number_formattedকরেছি আমার ডাটাবেসে একটি কলাম যুক্ত করব এবং নিজেই বিন্যাসিত নম্বরগুলি প্রবেশ করার সিদ্ধান্ত নিয়েছি । তবুও libphonenumberস্থানীয়ভাবে ফরম্যাটেড সংখ্যাগুলি তৈরি করতে ব্যবহার করুন তবে আমার ছোট প্রকল্পের জন্য এ জাতীয় বিশাল লাইব্রেরি সহ কেবলমাত্র ওভারকিল।
ম্যাগনাস ডাব্লু

9

USAচ্ছিক উপাদান হিসাবে অঞ্চল কোড সহ, এক্সটেনশনের জন্য প্রয়োজনীয় ডিলিমেটার এবং রেজেক্স মন্তব্যগুলি সহ এখানে আমার মার্কিন যুক্তরাষ্ট্রে সমাধান রয়েছে:

function formatPhoneNumber($s) {
$rx = "/
    (1)?\D*     # optional country code
    (\d{3})?\D* # optional area code
    (\d{3})\D*  # first three
    (\d{4})     # last four
    (?:\D+|$)   # extension delimiter or EOL
    (\d*)       # optional extension
/x";
preg_match($rx, $s, $matches);
if(!isset($matches[0])) return false;

$country = $matches[1];
$area = $matches[2];
$three = $matches[3];
$four = $matches[4];
$ext = $matches[5];

$out = "$three-$four";
if(!empty($area)) $out = "$area-$out";
if(!empty($country)) $out = "+$country-$out";
if(!empty($ext)) $out .= "x$ext";

// check that no digits were truncated
// if (preg_replace('/\D/', '', $s) != preg_replace('/\D/', '', $out)) return false;
return $out;
}

এবং এটি পরীক্ষা করার জন্য এখানে স্ক্রিপ্ট রয়েছে:

$numbers = [
'3334444',
'2223334444',
'12223334444',
'12223334444x5555',
'333-4444',
'(222)333-4444',
'+1 222-333-4444',
'1-222-333-4444ext555',
'cell: (222) 333-4444',
'(222) 333-4444 (cell)',
];

foreach($numbers as $number) {
    print(formatPhoneNumber($number)."<br>\r\n");
}

5

আরও ইউরোপীয় (বা সুইডিশ?) পদ্ধতিতে 7 থেকে 10 ডিজিট সহ ফোন নম্বরগুলি ফর্ম্যাট করার জন্য এখানে একটি সাধারণ ফাংশন রয়েছে:

function formatPhone($num) {
    $num = preg_replace('/[^0-9]/', '', $num);
    $len = strlen($num);

    if($len == 7) $num = preg_replace('/([0-9]{2})([0-9]{2})([0-9]{3})/', '$1 $2 $3', $num);
    elseif($len == 8) $num = preg_replace('/([0-9]{3})([0-9]{2})([0-9]{3})/', '$1 - $2 $3', $num);
    elseif($len == 9) $num = preg_replace('/([0-9]{3})([0-9]{2})([0-9]{2})([0-9]{2})/', '$1 - $2 $3 $4', $num);
    elseif($len == 10) $num = preg_replace('/([0-9]{3})([0-9]{2})([0-9]{2})([0-9]{3})/', '$1 - $2 $3 $4', $num);

    return $num;
}

5

এটি রেজেক্সের চেয়ে দ্রুত faster

$input = "0987654321"; 

$output = substr($input, -10, -7) . "-" . substr($input, -7, -4) . "-" . substr($input, -4); 
echo $output;

4
সংক্ষিপ্ত এবং মিষ্টি (y)
রহিম.নাগোরি

5

চাকা পুনর্নবীকরণ করবেন না! এই আশ্চর্যজনক গ্রন্থাগারটি আমদানি করুন:
https://github.com/giggsey/libphonenumber-for-php

$defaultCountry = 'SE'; // Based on the country of the user
$phoneUtil = PhoneNumberUtil::getInstance();
$swissNumberProto = $phoneUtil->parse($phoneNumber, $defaultCountry);

return $phoneUtil->format($swissNumberProto, PhoneNumberFormat::INTERNATIONAL);

এটি আন্তর্জাতিক ফোন নম্বরগুলি পার্সিং, ফর্ম্যাট করতে এবং যাচাই করার জন্য গুগলের লাইব্রেরি ভিত্তিক: https://github.com/google/libphonenumber


4
আমি মনে করি এটি একটি বৈধ উত্তর, তবে আপনি যদি স্ট্যাক ওভারফ্লো মান অনুযায়ী এটি কার্যকর হতে চান, তবে আপনার কেবল লিঙ্কটি ভাগ করে নেওয়ার চেয়ে লাইব্রেরি ব্যবহার করে ওপির সমস্যা সমাধানের একটি উদাহরণ অন্তর্ভুক্ত করার জন্য এটি সম্পাদনা করা উচিত।
আলেক_ও

4
আপনাকে ধন্যবাদ # আলেক_ও! আমি একটি উদাহরণ যুক্ত করেছি।
ভিক্টর জার্নহাইমার

4

আমি দেখতে পাচ্ছি এটি কোনও রেজেক্স, বা কয়েকটি সাবস্ট্রাস্ট কল ব্যবহার করে সম্ভব হচ্ছে (ধরে নিচ্ছি যে ইনপুটটি সর্বদা সেই বিন্যাসে থাকে এবং দৈর্ঘ্য পরিবর্তন হয় না))

কিছুটা এইরকম

$in = "+11234567890"; $output = substr($in,2,3)."-".substr($in,6,3)."-".substr($in,10,4);

এটা করা উচিত।


2

এর মতো কিছু চেষ্টা করুন:

preg_replace('/\d{3}/', '$0-', str_replace('.', null, trim($number)), 2);

8881112222এটির জন্য $ সংখ্যা লাগবে এবং রূপান্তরিত হবে 888-111-2222। আশাকরি এটা সাহায্য করবে.


4
আপনার পরামর্শের উত্স: hotscriptts.com/forums/php/36805-php-format- iPhone-numbers.html । এর str_replace '.'এছাড়াও আপডেট করা উচিত '-', বা অপসারণ করা উচিত। এটি নির্দিষ্ট ব্যবহারের ক্ষেত্রে সম্মুখীন হওয়ার কারণে এটি অন্তর্ভুক্ত ছিল - খুব অল্প প্রচেষ্টা সহ আপনি এটিকে রূপান্তর করতে preg_replace('/\d{3}/', '$0-', substr($number, 2))এবং প্রশ্নের সরাসরি উত্তর দিতে পারতেন ।
ইরিডইন

2

অন্য একটি বিকল্প - কনফিগারেশন থেকে একটি ফর্ম্যাট পেতে সহজেই আপডেট।

$numbers = explode("\n", '(111) 222-3333
((111) 222-3333
1112223333
111 222-3333
111-222-3333
(111)2223333
+11234567890
    1-8002353551
    123-456-7890   -Hello!
+1 - 1234567890
');
foreach( $numbers AS $number ){
  echo comMember_format::phoneNumber($number) . '<br>';
}

// ************************************************************************
// Format Phone Number
public function phoneNumber( $number ){
  $txt = preg_replace('/[\s\-|\.|\(|\)]/','',$number);
  $format = '[$1?$1 :][$2?($2):x][$3: ]$4[$5: ]$6[$7? $7:]';
  if( preg_match('/^(.*)(\d{3})([^\d]*)(\d{3})([^\d]*)(\d{4})([^\d]{0,1}.*)$/', $txt, $matches) ){
    $result = $format;
    foreach( $matches AS $k => $v ){
      $str = preg_match('/\[\$'.$k.'\?(.*?)\:(.*?)\]|\[\$'.$k.'\:(.*?)\]|(\$'.$k.'){1}/', $format, $filterMatch);
      if( $filterMatch ){
        $result = str_replace( $filterMatch[0], (!isset($filterMatch[3]) ? (strlen($v) ? str_replace( '$'.$k, $v, $filterMatch[1] ) : $filterMatch[2]) : (strlen($v) ? $v : (isset($filterMatch[4]) ? '' : (isset($filterMatch[3]) ? $filterMatch[3] : '')))), $result );
      }
    }
    return $result;
  }
  return $number;
}

1

সমস্ত,

আমি মনে করি আমি এটি ঠিক করেছি। বর্তমান ইনপুট ফাইলগুলির জন্য কাজ করা এবং এটি সম্পন্ন করার জন্য নিম্নলিখিত দুটি ফাংশন রয়েছে!

ফাংশন বিন্যাস_ফোন_ সংখ্যা:

        function format_phone_number ( $mynum, $mask ) {
        /*********************************************************************/
        /*   Purpose: Return either masked phone number or false             */
        /*     Masks: Val=1 or xxx xxx xxxx                                             */
        /*            Val=2 or xxx xxx.xxxx                                             */
        /*            Val=3 or xxx.xxx.xxxx                                             */
        /*            Val=4 or (xxx) xxx xxxx                                           */
        /*            Val=5 or (xxx) xxx.xxxx                                           */
        /*            Val=6 or (xxx).xxx.xxxx                                           */
        /*            Val=7 or (xxx) xxx-xxxx                                           */
        /*            Val=8 or (xxx)-xxx-xxxx                                           */
        /*********************************************************************/         
        $val_num        = self::validate_phone_number ( $mynum );
        if ( !$val_num && !is_string ( $mynum ) ) { 
            echo "Number $mynum is not a valid phone number! \n";
            return false;
        }   // end if !$val_num
        if ( ( $mask == 1 ) || ( $mask == 'xxx xxx xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '$1 $2 $3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 1
        if ( ( $mask == 2 ) || ( $mask == 'xxx xxx.xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '$1 $2.$3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 2
        if ( ( $mask == 3 ) || ( $mask == 'xxx.xxx.xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '$1.$2.$3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 3
        if ( ( $mask == 4 ) || ( $mask == '(xxx) xxx xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '($1) $2 $3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 4
        if ( ( $mask == 5 ) || ( $mask == '(xxx) xxx.xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '($1) $2.$3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 5
        if ( ( $mask == 6 ) || ( $mask == '(xxx).xxx.xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '($1).$2.$3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 6
        if ( ( $mask == 7 ) || ( $mask == '(xxx) xxx-xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '($1) $2-$3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 7
        if ( ( $mask == 8 ) || ( $mask == '(xxx)-xxx-xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '($1)-$2-$3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 8
        return false;       // Returns false if no conditions meet or input
    }  // end function format_phone_number

ফাংশন বৈধতা_ফোন_নম্বার:

        function validate_phone_number ( $phone ) {
        /*********************************************************************/
        /*   Purpose:   To determine if the passed string is a valid phone  */
        /*              number following one of the establish formatting        */
        /*                  styles for phone numbers.  This function also breaks    */
        /*                  a valid number into it's respective components of:      */
        /*                          3-digit area code,                                      */
        /*                          3-digit exchange code,                                  */
        /*                          4-digit subscriber number                               */
        /*                  and validates the number against 10 digit US NANPA  */
        /*                  guidelines.                                                         */
        /*********************************************************************/         
        $format_pattern =   '/^(?:(?:\((?=\d{3}\)))?(\d{3})(?:(?<=\(\d{3})\))'.
                                    '?[\s.\/-]?)?(\d{3})[\s\.\/-]?(\d{4})\s?(?:(?:(?:'.
                                    '(?:e|x|ex|ext)\.?\:?|extension\:?)\s?)(?=\d+)'.
                                    '(\d+))?$/';
        $nanpa_pattern      =   '/^(?:1)?(?(?!(37|96))[2-9][0-8][0-9](?<!(11)))?'.
                                    '[2-9][0-9]{2}(?<!(11))[0-9]{4}(?<!(555(01([0-9]'.
                                    '[0-9])|1212)))$/';

        // Init array of variables to false
        $valid = array('format' =>  false,
                            'nanpa' => false,
                            'ext'       => false,
                            'all'       => false);

        //Check data against the format analyzer
        if ( preg_match ( $format_pattern, $phone, $matchset ) ) {
            $valid['format'] = true;    
        }

        //If formatted properly, continue
        //if($valid['format']) {
        if ( !$valid['format'] ) {
            return false;
        } else {
            //Set array of new components
            $components =   array ( 'ac' => $matchset[1], //area code
                                                            'xc' => $matchset[2], //exchange code
                                                            'sn' => $matchset[3] //subscriber number
                                                            );
            //              $components =   array ( 'ac' => $matchset[1], //area code
            //                                              'xc' => $matchset[2], //exchange code
            //                                              'sn' => $matchset[3], //subscriber number
            //                                              'xn' => $matchset[4] //extension number             
            //                                              );

            //Set array of number variants
            $numbers    =   array ( 'original' => $matchset[0],
                                        'stripped' => substr(preg_replace('[\D]', '', $matchset[0]), 0, 10)
                                        );

            //Now let's check the first ten digits against NANPA standards
            if(preg_match($nanpa_pattern, $numbers['stripped'])) {
                $valid['nanpa'] = true;
            }

            //If the NANPA guidelines have been met, continue
            if ( $valid['nanpa'] ) {
                if ( !empty ( $components['xn'] ) ) {
                    if ( preg_match ( '/^[\d]{1,6}$/', $components['xn'] ) ) {
                        $valid['ext'] = true;
                    }   // end if if preg_match 
                } else {
                    $valid['ext'] = true;
                }   // end if if  !empty
            }   // end if $valid nanpa

            //If the extension number is valid or non-existent, continue
            if ( $valid['ext'] ) {
                $valid['all'] = true;
            }   // end if $valid ext
        }   // end if $valid
        return $valid['all'];
    }   // end functon validate_phone_number

লক্ষ্য করুন আমার কাছে এটি একটি শ্রেণীবদ্ধে রয়েছে, সুতরাং প্রথম ফাংশন / পদ্ধতি থেকে "স্ব :: বৈধতা_ফোন_নম্বার" কল করুন।

"বৈধতা_ফোন_নম্বার" ফাংশনের নোটিশ লাইন # 32 যেখানে আমি যুক্ত করেছি:

            if ( !$valid['format'] ) {
            return false;
        } else {

বৈধ ফোন নম্বর না হলে আমাকে মিথ্যা রিটার্নের প্রয়োজন।

এখনও আরও তথ্যের বিরুদ্ধে এটি পরীক্ষা করা প্রয়োজন, তবে বর্তমান ফর্ম্যাট সহ বর্তমান তথ্যগুলিতে কাজ করা এবং আমি এই নির্দিষ্ট ডেটা ব্যাচের জন্য স্টাইল '8' ব্যবহার করছি।

এছাড়াও আমি "এক্সটেনশন" যুক্তিটি মন্তব্য করেছিলাম কারণ এটি থেকে আমি ক্রমাগত ত্রুটি পাচ্ছিলাম, আমার ডেটাতে আমার কাছে সেই তথ্যটি নেই seeing


1

এটি 7, 10 এবং 11 ডিজিট লাগে, অতিরিক্ত অক্ষর সরিয়ে দেয় এবং স্ট্রিংয়ের ডান থেকে বামে ড্যাশ যুক্ত করে। কোনও স্থান বা বিন্দুতে ড্যাশ পরিবর্তন করুন।

$raw_phone = preg_replace('/\D/', '', $raw_phone);
$temp = str_split($raw_phone);
$phone_number = "";
for ($x=count($temp)-1;$x>=0;$x--) {
    if ($x === count($temp) - 5 || $x === count($temp) - 8 || $x === count($temp) - 11) {
        $phone_number = "-" . $phone_number;
    }
    $phone_number = $temp[$x] . $phone_number;
}
echo $phone_number;

1

আমি জানি ওপি একটি 123-456-7890 ফর্ম্যাটটির জন্য অনুরোধ করছে, তবে জন দুলের উত্তরের ভিত্তিতে আমি ফোনটি বন্ধনী ফর্ম্যাটে, যেমন (123) 456-7890 ফেরত দিতে সংশোধন করেছি। এটি কেবলমাত্র 7 এবং 10 সংখ্যার সংখ্যা পরিচালনা করে।

function format_phone_string( $raw_number ) {

    // remove everything but numbers
    $raw_number = preg_replace( '/\D/', '', $raw_number );

    // split each number into an array
    $arr_number = str_split($raw_number);

    // add a dummy value to the beginning of the array
    array_unshift( $arr_number, 'dummy' );

    // remove the dummy value so now the array keys start at 1
    unset($arr_number[0]);

    // get the number of numbers in the number
    $num_number = count($arr_number);

    // loop through each number backward starting at the end
    for ( $x = $num_number; $x >= 0; $x-- ) {

        if ( $x === $num_number - 4 ) {
            // before the fourth to last number

            $phone_number = "-" . $phone_number;
        }
        else if ( $x === $num_number - 7 && $num_number > 7 ) {
            // before the seventh to last number
            // and only if the number is more than 7 digits

            $phone_number = ") " . $phone_number;
        }
        else if ( $x === $num_number - 10 ) {
            // before the tenth to last number

            $phone_number = "(" . $phone_number;
        }

        // concatenate each number (possibly with modifications) back on
        $phone_number = $arr_number[$x] . $phone_number;
    }

    return $phone_number;
}

1

এখানে আমার গ্রহণ:

$phone='+11234567890';
$parts=sscanf($phone,'%2c%3c%3c%4c');
print "$parts[1]-$parts[2]-$parts[3]";

//  123-456-7890

sscanfফাংশন একটি দ্বিতীয় প্যারামিটার হিসাবে একটি ফরম্যাট স্ট্রিং এটা কহন কিভাবে প্রথম স্ট্রিং থেকে অক্ষরের ব্যাখ্যা করা লাগে। এই ক্ষেত্রে এর অর্থ 2 অক্ষর ( %2c), 3 অক্ষর, 3 অক্ষর, 4 অক্ষর।

সাধারণত ফাংশনটিতে sscanfনিষ্কাশিত ডেটা ক্যাপচারের জন্য ভেরিয়েবলগুলিও অন্তর্ভুক্ত থাকবে। যদি না হয় তবে ডেটাটি অ্যারেতে ফিরে আসবে যা আমি বলেছি $parts

printবিবৃতি ইন্টারপোলেট স্ট্রিং আউটপুট। $part[0]উপেক্ষা করা হয়।

অস্ট্রেলিয়ান ফোন নম্বরগুলি ফর্ম্যাট করতে আমি অনুরূপ ফাংশন ব্যবহার করেছি।

নোট করুন যে ফোন নম্বর সংরক্ষণের দৃষ্টিকোণ থেকে:

  • ফোন নম্বরগুলি স্ট্রিং
  • সঞ্চিত ডেটাগুলিতে শূন্যস্থান বা হাইফেনের মতো বিন্যাসকরণ অন্তর্ভুক্ত করা উচিত নয়

এটি সর্বাধিক মার্জিত এবং পঠনযোগ্য সমাধান। KISS। যদি আপনার ইনপুট স্ট্রিংগুলি সর্বদা একই প্যাটার্নটি অনুসরণ করে তবে আর স্ক্রোল করবেন না। এই সংযোজনের জন্য আপনাকে ধন্যবাদ।
মুসা

1

ইউনাইটেড কিংডম ফোন ফর্ম্যাটস

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

আউটপুটটির ফর্ম্যাটটি নিশ্চিত করে যে কোনও প্রাপ্ত সফ্টওয়্যার আউটপুটটিকে পূর্ণসংখ্যার পরিবর্তে পাঠ্য হিসাবে ব্যাখ্যা করে (যা তাত্ক্ষণিকভাবে প্রথম শূন্যটি হারাবে) এবং ফর্ম্যাটটি ব্রিটিশ টেলিকমগুলির সাথে সামঞ্জস্যপূর্ণ


+441234567890 উত্পাদন করে (01234) 567 890
02012345678 উত্পাদন (020) 1234 5678
1923123456 উত্পাদন (01923) 123 456
01923123456 উত্পাদন (01923) 123 456 01923
হেলো এটি টেক্সট 123456 উত্পাদন (01923) 123 456

সংখ্যার এক্সচেঞ্জ বিভাগের তাত্পর্য - বন্ধনীগুলিতে - যুক্তরাজ্য এবং অন্যান্য বেশিরভাগ দেশে একই এক্সচেঞ্জের মধ্যে সংখ্যার মধ্যে কলগুলি এক্সচেঞ্জ বিভাগটি বাদ দিয়ে করা যেতে পারে। তবে এটি 07, 08 এবং 09 সিরিজের ফোন নম্বরগুলিতে প্রযোজ্য নয়।

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

পদ্ধতিটি কলিং স্ক্রিপ্ট থেকে এভাবে আহ্বান করা হয়

$telephone = New Telephone;
$formattedPhoneNumber = $telephone->toIntegerForm($num)

`

<?php
class   Telephone 
{   
    public function toIntegerForm($num) {
        /*
         * This section takes the number, whatever its format, and purifies it to just digits without any space or other characters
         * This ensures that the formatter only has one type of input to deal with
         */
        $number = str_replace('+44', '0', $num);
        $length = strlen($number);
        $digits = '';
        $i=0;
        while ($i<$length){
            $digits .= $this->first( substr($number,$i,1) , $i);
            $i++;
        }
        if (strlen($number)<10) {return '';}
        return $this->toTextForm($digits);
    }
    public function toTextForm($number) {

        /*
         * This works on the purified number to then format it according to the group code
         * Numbers starting 01 and 07 are grouped 5 3 3
         * Other numbers are grouped 3 4 4 
         * 
         */
        if (substr($number,0,1) == '+') { return $number; }
        $group = substr($number,0,2);
        switch ($group){
            case "02" :
                $formattedNumber = $this->teleNum($number, 3, 4); // If number commences '02N' then output will be (02N) NNNN NNNN
                break;
            default :
                $formattedNumber = $this->teleNum($number, 5, 3); // Otherwise the ooutput will be (0NNNN) NNN NNN
        }
        return $formattedNumber;

    }
    private function first($digit,$position){
        if ($digit == '+' && $position == 0) {return $digit;};
        if (!is_numeric($digit)){
            return '';
        }
        if ($position == 0) {
            return ($digit == '0' ) ? $digit :  '0'.$digit;
        } else {
            return $digit;
        } 
    }
    private function teleNum($number,$a,$b){
        /*
         * Formats the required output 
         */
        $c=strlen($number)-($a+$b);
        $bit1 = substr($number,0,$a);
        $bit2 = substr($number,$a,$b);
        $bit3 = substr($number,$a+$b,$c);
        return '('.$bit1.') '.$bit2." ".$bit3;
    }
}

0

এটি কান্ট্রি কোড ছাড়াই যুক্তরাজ্যের ল্যান্ডলাইনগুলির জন্য

function format_phone_number($number) {
    $result = preg_replace('~.*(\d{2})[^\d]{0,7}(\d{4})[^\d]{0,7}(\d{4}).*~', '$1 $2 $3', $number);
    return $result;
}

ফলাফল:

2012345678
becomes
20 1234 5678

0

ফর্ম্যাটগুলি পরিবর্তন করতে পারে এমন সাবস্ট্রাস্ট ভিত্তিক ফাংশনটি দেখুন

function phone(string $in): string
{
    $FORMAT_PHONE = [1,3,3,4];
    $result =[];
    $position = 0;
    foreach ($FORMAT_PHONE as $key => $item){
        $result[] = substr($in, $position, $item);
        $position += $item;
    }
    return '+'.implode('-',$result);
}

0

ফোন নম্বর পরীক্ষা করুন

$phone = '+385 99 1234 1234'

$str = preg_match('/^\+?\d{1,3}[\s-]?\d{1,3}[\s-]?\d{1,4}[\s-]?\d{1,4}$/', $phone);

if($str){
return true;
}else{
return false;
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.