Я знаю, что этот вопрос древний, но в интересах любого, кто ищет решения, вот еще одна стратегия для баз данных, которые не поддерживают такие функции, как MONTH ():
db.session. query (sa.func.count (Article.id)). \ group_by (sa.func.strftime ("% Y-% m-% d", Article.created)). all ()
По существу это превращает метки времени в усеченные строки, которые затем можно сгруппировать.
Если вам нужны только самые последние записи, вы можете добавить, например:
order_by (Article.created.desc ()). limit (7)
Следуя этой стратегии, вы можете легко создавать группы, такие как день недели, просто опуская год и месяц.
Что бы я делал, это игнорировать формат и проверять числовое содержимое:
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);
}
Я бы предложил использовать что-то более ясное (особенно думая, кому нужно будет поддерживать код) ... как насчет:
var formats = "(999)999-9999|999-999-9999|9999999999";
var r = RegExp("^(" +
formats
.replace(/([\(\)])/g, "\\$1")
.replace(/9/g,"\\d") +
")$");
, где регулярное выражение построено из прозрачного шаблона? Добавление нового было бы без проблем, и даже сам клиент мог бы сделать это на странице «Параметры».
Следующий REGEX будет проверять любой из этих форматов:
(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}$/
.
, иначе он будет соответствовать произвольному символу, нарушив ваше регулярное выражение.
– Christoph
12 March 2013 в 12:25
Я должен согласиться с тем, что проверка номеров телефонов является трудной задачей. Что касается этой конкретной проблемы, я бы изменил регулярное выражение из
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)\d{4}$/
на
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/
, поскольку единственным лишним элементом, который становится ненужным, является последнее тире / пробел.
\\(?\d{3}\\)?([\-\s\.])?\d{3}\1?\d{4}
Это подтвердит любой номер телефона с переменным форматом:
\\(?\d{3}\\)?
находит 3 цифры, заключенные в скобки или нет.
([\-\s\.])?
находит любой из этих разделителей символы или нет
\d{3}
находит 3 цифры
\1
использует первый согласованный разделитель - это гарантирует, что разделители будут одинаковыми. Таким образом, (000) 999-5555 не будет проверяться здесь, потому что есть разделитель пробела и тире, поэтому просто удалите «\ 1» и замените суб-шаблон разделителя (это также будет проверять нестандартные форматы). Тем не менее, вы должны указывать формат для ввода пользователем.
\d{4}
находит 4 цифры
Проверяет:
BTW это для JavaScript, следовательно, для двойного экранирования.
Это будет работать:
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/
Символ ?
означает, что предыдущая группа должна совпадать с нулем или один раз. Группа (-|\s)
будет соответствовать символу -
или |
. Добавление ?
после второго появления этой группы в вашем регулярном выражении позволяет вам сопоставить последовательность из десяти последовательных цифр.
/^[+]*[(]{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
Это очень свободный вариант, и я предпочитаю держать его таким образом, в основном я использую его в регистрационных формах, где пользователи должны добавьте их номер телефона. Обычно у пользователей возникают проблемы с формами, которые обеспечивают соблюдение строгих правил форматирования, я предпочитаю, чтобы пользователь заполнил номер и формат, который он отображает, или перед тем, как сохранить его в базе данных. http://regexr.com/3c53v
+41 (79) 123 45 67
(Швейцария): /^[+]?[\s./0-9]*[(]?[0-9]{1,4}[)]?[-\s./0-9]*$/g
– Remigius Stalder
26 July 2018 в 11:05
Ответы каждого замечательные, но вот один из них, я думаю, немного более полный ...
Это написано для использования javascript одного числа в одной строке:
^(?!.*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})$
Если вы хотите совпадать с границами слов, просто измените ^ и $ на \ b
. Я приветствую любые предложения, исправления или критику этого решения. Насколько я могу судить, это соответствует формату NANP (для номеров США - я не проверял другие североамериканские страны при создании этого), избегает любых ошибок 911 (не может быть в коде страны или региональном коде), устраняет только те 555 номеров, которые фактически недействительны (код региона 555, за которым следует 01xx, где x = любое число).
Хотя этот пост является старым, но хочет оставить мой вклад. (555) 555-5555 1 555 555 5555 1 555-555-5555 1 (555) 555-5555
это не принято: 555-5555 -> принять это использование: ^ +? 1? \ s *? (? (\ d {3})? (? :) | [- | \ s])? \ s *? \ d {3} [- | \ s]? \ D {4} $ 5555555 -> принять это использование: ^ +? 1? \ S *? (? (\ D {3})? (? :) | [- | \ s])? \ s *? \ d {3} [- | \ s]? \ d {4} $ 1 555) 555-5555 123 ** & amp; !! 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
это код, который я использовал:
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");
Где str может быть любой из этих форм: 555-555-5555 (555) 555-5555 (555) 555-5555 555 555 5555 5555555555 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");
Существует слишком много вариантов регулярных выражений для проверки номера телефона. Я рекомендую эту статью: JavaScript: HTML-форма - проверка номера телефона , где для каждого случая указаны несколько вариантов. Если вы хотите углубить регулярное выражение для пользовательского выражения, вы можете просмотреть эту документацию .
Парсер парсера Javascript с метаданными для более чем 200 стран: https://github.com/googlei18n/libphonenumber
Если вы ищете 10 и всего 10 цифр, игнорируйте все, кроме цифр -
return value.match(/\d/g).length===10;
return (value.match(/\d/g) || []).length == 10
или намного проще (но в равной степени ошибочно): return value.replace(/\D/g,'').length == 10
.
– RobG
23 August 2016 в 05:56
Моим регулярным выражением является следующее:
/^[\+]?[(]?[0-9]{3}[)]?[-\s\.]?[0-9]{3}[-\s\.]?[0-9]{4,6}$/im
Допустимые форматы:
(123) 456-7890 (123)456-7890 123-456-7890 123.456.7890 1234567890 +31636363634 075-63546725
i
делает выражение нечувствительным к регистру, а m
выполняет многострочный поиск
– Rodrigo Leite
3 August 2017 в 15:20
Просто захотелось добавить решение специально для выбора нелокальных телефонных номеров (800 и 900 типов).
(\+?1[-.(\s]?|\()?(900|8(0|4|5|6|7|8)\3+)[)\s]?[-.\s]?\d{3}[-.\s]?\d{4}
/^(()?\d{3}())?(-|\s)?\d{3}(-|\s)?\d{4}$/
Символ ?
означает, что предыдущая группа должна совпадать с нулем или один раз. Группа (-|\s)
будет соответствовать символу -
или |
.
Простое регулярное выражение: /\b\d{3}[-.]?\d{3}[-.]?\d{4}\b/g
Проверьте формат, надеюсь, что он работает: 444-555-1234 f: 246.555.8888 m: 1235554567
Попробуйте это: он также включает проверку для международных форматов.
/^[+]?(1\-|1\s|1|\d{3}\-|\d{3}\s|)?((\(\d{3}\))|\d{3})(\-|\s)?(\d{3})(\-|\s)?(\d{4})$/g
Это регулярное выражение проверяет следующий формат:
Эта функция хорошо работала для нас:
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-9773207706'));
Если вы используете тег ввода, который этот код вам поможет. Я пишу этот код самостоятельно, и я думаю, что это очень хороший способ использования в качестве входных данных. но вы можете изменить его, используя свой формат. Это поможет пользователю исправить свой формат на входном теге.
$("#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;
}
В Google есть хорошая библиотека для обработки телефонных номеров в Javascript: https://github.com/googlei18n/libphonenumber . Работает также с Java и C ++.
Я бы предпочел использовать их, потому что этот должен быть действительно хорошо протестирован в процессе производства. Поэтому это должно быть безопасно для включения.