1

Тема: regex діапазон

Допоможіть будь ласка с regex'om діапазону по укр телефонам.
До прикладу cхема
\([\d]{2,3}\)[ ]{0,2}[\d]{7}
[\d]{3}-[\d]{3}-[\d]{2}-[\d]{2}
[\d]{3}[- ()]{1}[\d]{3}-[\d]{2}-[\d]{2}
[\d]{3}\) [\d]{7}
[\d]{3}\) [\d]{3}[ -]{1}[\d]{2}[ -]{1}[\d]{2}[ -]{1}
[\d]{12}|[\d]{11}
[\d]{10}|[\d]{9}
[\d]{3}[- ()]{1}[\d]{3}[- ()]{1}[\d]{2}[- ()]{1}[\d]{2}
[\d]{3}[- ()]{1}[\d]{2}[- ()]{1}[\d]{2}[- ()]{1}[\d]{3}
[\d]{3}[- ()]{1}[\d]{2}[- ()]{1}[\d]{3}[- ()]{1}[\d]{2}
[\d]{3}[- ()]{1}[\d]{7}
[\d]{3}[- ()]{1}[\d]{4}[- ()]{1}[\d]{3}
[\d]{3}[- ()]{1}[\d]{3}[- ()]{1}[\d]{4}
Але проблема в тому що не реагує на схему телефона +38(097)xxxxxxx. Можна один приклад с цього рг для номерів +38...?
Дякую вам.
Чого ще не хватає цій схемі?

Подякували: 221VOLT1

2

Re: regex діапазон

Мені чомусь здається, що простіше вбудованими функціями обробити,аніж юзати такі регулярки.

Подякували: 221VOLT, leofun012

3 Востаннє редагувалося VTrim (02.01.2016 22:08:42)

Re: regex діапазон

Найпростіший варіант це залишити +38 "як є", а коди операторів дати на вибір - 068,098.. Через <option value=.....
А в PHP перевіряти

$codeOps = ['098','068'];
if(!in_array($_POST['codeOperator'], $codeOps)) {
//помилка вибору оператора
}

А для самого номеру

$number = $_POST['number'];
if((mb_strlen($number) <> 7) || !ctype_digit($number)) {
//помилка формату номера
}

Або ж об'єднати всі умови в один if

Подякували: 221VOLT1

4

Re: regex діапазон

vaxxxye написав:

Допоможіть будь ласка с regex'om діапазону по укр телефонам.

Ось Вам регулярка:

(\+38|)\s*(\(\d{3}\)|\-\d{3}\-|\d{3})\s*(\s\d|\-\d|\d){7}

юзайте на здоров'я.
Потестувати можна тут.

Подякували: 0xDADA11C7, vaxxxye, 221VOLT3

5

Re: regex діапазон

leofun01 написав:
vaxxxye написав:

Допоможіть будь ласка с regex'om діапазону по укр телефонам.

Ось Вам регулярка:

(\+38|)\s*(\(\d{3}\)|\-\d{3}\-|\d{3})\s*(\s\d|\-\d|\d){7}

юзайте на здоров'я.
Потестувати можна тут.

Вдячний дуже) але все ж вона не універсальна,чомусь багато промахів.Я в регах не дуже розбираюсь.Намаюсь методом "втику" зробити щось краще але поки не виходить.
Буду намагатись доопрацювати те що маю...хоча не дуже виходить.
Можливо ще є варіанти опрацювання регексов "варіанта1"?

Подякували: 221VOLT1

6

Re: regex діапазон

VTrim написав:

Мені чомусь здається, що простіше вбудованими функціями обробити,аніж юзати такі регулярки.

можливо й так) але намагаюсь виходити с того що маю.)

7 Востаннє редагувалося 221VOLT (03.01.2016 12:47:22)

Re: regex діапазон

http://regexr.com/ - ще тут методом тика можна зібрати регулярку)

vaxxxye написав:

Допоможіть будь ласка с regex'om діапазону по укр телефонам.
До прикладу cхема
\([\d]{2,3}\)[ ]{0,2}[\d]{7}
[\d]{3}-[\d]{3}-[\d]{2}-[\d]{2}
[\d]{3}[- ()]{1}[\d]{3}-[\d]{2}-[\d]{2}
[\d]{3}\) [\d]{7}
[\d]{3}\) [\d]{3}[ -]{1}[\d]{2}[ -]{1}[\d]{2}[ -]{1}
[\d]{12}|[\d]{11}
[\d]{10}|[\d]{9}
[\d]{3}[- ()]{1}[\d]{3}[- ()]{1}[\d]{2}[- ()]{1}[\d]{2}
[\d]{3}[- ()]{1}[\d]{2}[- ()]{1}[\d]{2}[- ()]{1}[\d]{3}
[\d]{3}[- ()]{1}[\d]{2}[- ()]{1}[\d]{3}[- ()]{1}[\d]{2}
[\d]{3}[- ()]{1}[\d]{7}
[\d]{3}[- ()]{1}[\d]{4}[- ()]{1}[\d]{3}
[\d]{3}[- ()]{1}[\d]{3}[- ()]{1}[\d]{4}
Але проблема в тому що не реагує на схему телефона +38(097)xxxxxxx. Можна один приклад с цього рг для номерів +38...?
Дякую вам.
Чого ще не хватає цій схемі?

вам вище вірно відповіли - краще привести це все щастя до одного виду-формату так сказати,
щоб не мучатися з зоопарком))

наприклад я залишив би лише
+38(093)1234567
такий вигляд
/\+(\d{2,3})\((\d{3})\)(\d{7})/
якось так)

Подякували: leofun011

8

Re: regex діапазон

vaxxxye написав:
VTrim написав:

Мені чомусь здається, що простіше вбудованими функціями обробити,аніж юзати такі регулярки.

можливо й так) але намагаюсь виходити с того що маю.)

Треба виходити з того,що краще. Регулярки працюють помаліше.

Подякували: 221VOLT, leofun012

9

Re: regex діапазон

221VOLT написав:

http://regexr.com/ - ще тут методом тика можна зібрати регулярку)

vaxxxye написав:

Допоможіть будь ласка с regex'om діапазону по укр телефонам.
До прикладу cхема
\([\d]{2,3}\)[ ]{0,2}[\d]{7}
[\d]{3}-[\d]{3}-[\d]{2}-[\d]{2}
[\d]{3}[- ()]{1}[\d]{3}-[\d]{2}-[\d]{2}
[\d]{3}\) [\d]{7}
[\d]{3}\) [\d]{3}[ -]{1}[\d]{2}[ -]{1}[\d]{2}[ -]{1}
[\d]{12}|[\d]{11}
[\d]{10}|[\d]{9}
[\d]{3}[- ()]{1}[\d]{3}[- ()]{1}[\d]{2}[- ()]{1}[\d]{2}
[\d]{3}[- ()]{1}[\d]{2}[- ()]{1}[\d]{2}[- ()]{1}[\d]{3}
[\d]{3}[- ()]{1}[\d]{2}[- ()]{1}[\d]{3}[- ()]{1}[\d]{2}
[\d]{3}[- ()]{1}[\d]{7}
[\d]{3}[- ()]{1}[\d]{4}[- ()]{1}[\d]{3}
[\d]{3}[- ()]{1}[\d]{3}[- ()]{1}[\d]{4}
Але проблема в тому що не реагує на схему телефона +38(097)xxxxxxx. Можна один приклад с цього рг для номерів +38...?
Дякую вам.
Чого ще не хватає цій схемі?

вам вище вірно відповіли - краще привести це все щастя до одного виду-формату так сказати,
щоб не мучатися з зоопарком))

наприклад я залишив би лише
+38(093)1234567
такий вигляд
/\+(\d{2,3})\((\d{3})\)(\d{7})/
якось так)

Пасибо,но всё бы нечего если бы при смене структуры регулярки сразу всё переставало работать)
Как только вписываю другую регулярку оно вообще не на что не реагирует.Что бы во всем этом не копатся,может еще предложения есть по схеме "поста1" не нарушая структуру?

10 Востаннє редагувалося leofun01 (03.01.2016 14:18:32)

Re: regex діапазон

Можна попробувати ще такий варіант:

(\+\d{1,3}|\d{1,3}|)(\-|)\s*(\(\d{2,3}\)|\-\d{2,3}\-|\d{2,3})\s*(\s\d|\-\d|\d){7}
Подякували: vaxxxye1

11

Re: regex діапазон

leofun01 написав:

Можна попробувати ще такий варіант:

(\+\d{1,3}|\d{1,3}|)(\-|)\s*(\(\d{2,3}\)|\-\d{2,3}\-|\d{2,3})\s*(\s\d|\-\d|\d){7}

це вже краще (теперь уже хоть реагує але :+38 097-143-xx-xx і +38 (097) xxx xxx 1 и всі інші телефони пропускає і заберає тільки номери такого типу -"1451823495"
"2000434872"
"2000434872"
"2000434872"
"2000434872"
"2000434872"
"2000434872"
"2000434872"
"2000434872"
"2000434872"
"2000434872"

12 Востаннє редагувалося leofun01 (03.01.2016 15:18:05)

Re: regex діапазон

Давайте зробимо наступне:
Зайдіть на будь-який сайт, який перевіряє текст на відповідність регулярному виразу (наприклад regex101.com, чи regexr.com);
Введіть регулярний вираз

(\+?\d{1,3})?\-?\s*(\(\d{2,3}\)|\-\d{2,3}\-|\d{2,3})\s*(\s\d|\-\d|\d){7}

з параметром /g вкінці (якщо доступно);
В текстове поле введіть всі ті варіанти, які Ви хочете протестувати, наприклад:

1451823495
+380987654321
+38 098 7654321
+38(098)7654321
+38-(098)-7654321
+38 098 76-54-321
+38 098 765-43-21
098-76-54-321
+38-098-7654321
098 7654321
0987654321
0987654321
+38 098-765-43-21
098-765-43-21

Якщо всі рядки повністю підспічені, значить з регулярним виразом все добре і потрібно розбиратися з самим програмним кодом.
Якщо деякі рядки не підсвічені, тоді треба дописувати регулярний вираз.

І ще одне, сподіваюсь в програмі Ви використовуєте регулярний вираз по черзі для кожного окремого рядка, а не для всіх зразу.

Подякували: 221VOLT1

13 Востаннє редагувалося leofun01 (03.01.2016 15:26:27)

Re: regex діапазон

Вибачте, затупив.
Регулярний вираз:

((\+?\d{1,3})?\-?\s*(\(\d{2,3}\)|\-\d{2,3}\-|\d{2,3})\s*(\s\d|\-\d|\d){7})$

з параметром /gm вкінці (якщо доступно).

Подякували: 221VOLT, 0xDADA11C72

14

Re: regex діапазон

leofun01 написав:

Вибачте, затупив.
Регулярний вираз:

((\+?\d{1,3})?\-?\s*(\(\d{2,3}\)|\-\d{2,3}\-|\d{2,3})\s*(\s\d|\-\d|\d){7})$

з параметром /gm вкінці (якщо доступно).

мне кажется тут проблема в том что схема ориентируется на posix-совместимые рг.
ибо к примеру  [\d]{3}-[\d]{3}-[\d]{2}-[\d]{2} отвечает за поиск такой модели символов -  097-955-55-55.
Следовательно тогда вопрос как подогнать их по +380 и 38.
по типу:
(xx) xxxxxxx
+38 xxx xxxxxxx
+38 (xxx) xxx xxx x
+380 (xx) xxx-xxx-x
+38 xxxxxxxxxx
+38 xxx xxx xx xx
+38 xxx xxx xxx x
+380 (xx) xxx-xx-xx
+380 (xx) xx-xx-xxx
+38 xxx-xxx-xx-xx
+38 (xxx)-xxx-xx-xx
+38 (xxx)xx-xx-xxx
+380xxxxxxxxxx

15

Re: regex діапазон

Якщо потрібно тільки укр.номери, то можна так:

((\+?38)?\-?\s*((\(0\d{2}\)|\-0\d{2}\-|0\d{2})|0?\-?\s*(\(\d{2}\)|\-\d{2}\-|\d{2}))\s*(\s\d|\-\d|\d){7})$

А взагалі, я не зрозумів з чим виникли труднощі.