These functions currently only work for US telephone numbers, perhaps one day internationalisation will be added. View source if you cannot see the code properly.

function clean_phone($phone)
{
  $p = strtolower($phone);
  for ($i=0;$i<strlen($p);$i++)
  {
    $a = ord(substr($p, $i, 1));
    // If ( Not Numeric ) or ( Not 'x' )
    if ((($a >= 48) && ($a <= 57)) || ($a == 120)) $r .= substr($p, $i, 1);
  }
  return $r;
}

function format_phone($phone)
{
  $phone = clean_phone($phone);
  $ret = "";
  $ext = "";
  $i = strpos($phone,'x');
  if (!($i === false))
  {
    // Contains extension
    $ext = "x".substr($phone,$i);
    $phone = substr($phone,0,$i);
  }
  // Phones with no extension
  switch(strlen($phone))
  {
    case 7:
      $ret = substr($phone, 0, 3)."-".substr($phone, 3);
      break;
    case 8:
      $ret = substr($phone, 0, 4)."-".substr($phone, 4);
      break;
    case 10:
      $ret = "(".substr($phone, 0, 3).") ".substr($phone, 3, 3)."-".substr($phone, 6, 4);
      break;
    default:
      $ret = $phone;
  }
  return $ret.$ext;
}