fork(3) download
  1. <?php
  2. /*
  3. Validar teléfonos argentinos con una expresión regular
  4. https://es.stackoverflow.com/q/136325/127
  5. */
  6.  
  7. // Valida teléfonos argentinos (fijos, móviles, no geográficos o sociales)
  8. // Si es válido, devuelve un array con el número parseado.
  9. //
  10. function tel_argentino( $tel ) {
  11. $re = '/^(?:((?P<p1>(?:\( ?)?+)(?:\+|00)?(54)(?<p2>(?: ?\))?+)(?P<sep>(?:[-.]| (?:[-.] )?)?+)(?:(?&p1)(9)(?&p2)(?&sep))?|(?&p1)(0)(?&p2)(?&sep))?+(?&p1)(11|([23]\d{2}(\d)??|(?(-10)(?(-5)(?!)|[68]\d{2})|(?!))))(?&p2)(?&sep)(?(-5)|(?&p1)(15)(?&p2)(?&sep))?(?:([3-6])(?&sep)|([12789]))(\d(?(-5)|\d(?(-6)|\d)))(?&sep)(\d{4})|(1\d{2}|911))$/D';
  12. if (preg_match($re,$tel,$match)) {
  13. ,$internacional_completo,,$internacional,,,$internacional_celu,$prefijo_acceso,$area,,,
  14. $prefijo_celu,$local_1a,$local_1b,$local_1c,$local_2,$numero_social
  15. ) = array_pad($match,20,'');
  16.  
  17. $local_1 = $local_1a . $local_1b . $local_1c;
  18. $local = $local_1 . $local_2;
  19. $es_fijo = !($internacional_celu || $prefijo_celu);
  20. $numero = $area.$local.$numero_social;
  21. $completo = $internacional.$internacional_celu.$area.$prefijo_celu.$local.$numero_social;
  22. return compact(
  23. 'numero','completo','internacional','internacional_celu','area',
  24. 'prefijo_celu','local','local_1','local_2','numero_social','es_fijo'
  25. );
  26. }
  27. return false;
  28. }
  29.  
  30.  
  31. // ----- PRUEBAS -----
  32. //
  33. $pruebas = [
  34. '+54 11 4444-0000', '+54 341 1118888', '(+549261)1234567', '(0351)333-4444',
  35. '266 - 999 - 0000', '343-1238888', '+5491188884444', '543412228888',
  36. '(54)233-15-111-2222', '(+54-343)9990000', '+54 (3436) 99-0000',
  37. '(0)8003337333', '+54 11(4444)0000', '+54 341 1111-888', '(+54261)12-34567',
  38. '(03510)3334444', '266-99-0000', '4444-5555', '34-5555-0000'
  39. ];
  40.  
  41.  
  42. $fcolumnas = "%19s %-3s %-11s %4s %4s %-4s %s\n";
  43. printf($fcolumnas,'PRUEBA',"\u{2754}",'NUMERO','AREA','L1 ','L2','FIJO?');
  44.  
  45. foreach ($pruebas as &$prueba) {
  46. $tel = tel_argentino($prueba);
  47. $fcolumnas,
  48. $prueba,($tel?"\u{2714}":"\u{2716}"),
  49. $tel['numero'],$tel['area'],$tel['local_1'],$tel['local_2'],($tel?($tel['es_fijo']?'sí':'no'):'')
  50. );
  51. }
Success #stdin #stdout 0.02s 24048KB
stdin
Standard input is empty
stdout
             PRUEBA ❔ NUMERO      AREA  L1  L2    FIJO?
   +54 11 4444-0000 ✔ 1144440000    11 4444 0000  sí
    +54 341 1118888 ✔ 3411118888   341  111 8888  sí
   (+549261)1234567 ✔ 2611234567   261  123 4567  no
     (0351)333-4444 ✔ 3513334444   351  333 4444  sí
   266 - 999 - 0000 ✔ 2669990000   266  999 0000  sí
        343-1238888 ✔ 3431238888   343  123 8888  sí
     +5491188884444 ✔ 1188884444    11 8888 4444  no
       543412228888 ✔ 3412228888   341  222 8888  sí
(54)233-15-111-2222 ✔ 2331112222   233  111 2222  no
   (+54-343)9990000 ✔ 3439990000   343  999 0000  sí
 +54 (3436) 99-0000 ✔ 3436990000  3436   99 0000  sí
      (0)8003337333 ✔ 8003337333   800  333 7333  sí
   +54 11(4444)0000 ✖                             
   +54 341 1111-888 ✖                             
   (+54261)12-34567 ✖                             
     (03510)3334444 ✖                             
        266-99-0000 ✖                             
          4444-5555 ✖                             
       34-5555-0000 ✖