Регулярка. Вырезать из строки номера телефонов

Yura

Новичок
Регулярка. Вырезать из строки номера телефонов

Есть строки типа таких:
Красноярск - тел.: (3912) 56-39-36; факс: (3912) 56-39-37;
тел./факс: +370 51 58477, +370 51 58466, +370 51 58477
тел.: (095) 284-02-18, 284-14-30
тел (01562) 4-27-30, 4-19-28; факс: (01562) 4-18-16
Тел./факс: +375 (17) 252-18-66 - отдел сбыта.
отдел маркетинга и реализации - тел.: (8452) 69-08-66, тел./факс: (8452)69-22-73; приемная генерального директора - тел.: (8452) 69-08-22

Таких с трок в базе много.
Нужно из каждой из строк вырезать номер телефона. Если в строке несколько номеров, то достаточно только первый. Во всех строках перед самим номером есть "тел" + иногда еще что-то (точка, двоеточие, "/факс" и т.д.). Номер телефона может содержать цифры, знак "+" перед кодом города, скобки (с содержанием кода города), знак "-"

Я пытаюсь делать так:
preg_match_all("~(тел.*)([\(\)0-9\-]*.*)~Uims", $ttt, $out, PREG_SET_ORDER);
Не работает. Подскажите, что у меня не правильно
 

Alexandre

PHPПенсионер
Интересный способ хранения адресной информации
и это не единичный случай...

что-то типа:
[тел\.|тел\.\/факс]: ( ?)\(\d+\) (\d+-)+(\d+)\b

[тел\.|тел\.\/факс]: - слово тел. или тел./факс, далее двоеточие
( ?) - может быть пробел
\(\d+\) - выражение (nnnn)
далее пробел
(\d+-)+ - повторяется группа nnn-nn-nn-
(\d+) - заканчивается группа nnn
\b - символ разделитель, пробел или таб или конец строки
 

Yura

Новичок
Автор оригинала: Гравицапа
Интересный способ хранения адресной информации.
Интересный, который сейчас есть, или который я хочу реализовать?

Сейчас есть таблица в базе данных, в которой есть поля с названиями компаний, городом, кратким описанием, контактами. Вот контакты так и представлены как я написал. Нужно из всего этого "контакта" оставить только номер телефона.
 

Yura

Новичок
Автор оригинала: Alexandre
и это не единичный случай...

что-то типа:
[тел\.|тел\.\/факс]: ( ?)\(\d+\) (\d+-)+(\d+)\b

[тел\.|тел\.\/факс]: - слово тел. или тел./факс, далее двоеточие
( ?) - может быть пробел
\(\d+\) - выражение (nnnn)
далее пробел
(\d+-)+ - повторяется группа nnn-nn-nn-
(\d+) - заканчивается группа nnn
\b - символ разделитель, пробел или таб или конец строки
Этот вариант работает, если в номере телефона есть код города в скобках. А если номер без скобок и со знаком "+", то не работает

-~{}~ 13.07.07 14:11:

Сделал так "~([тел\.|тел.факс]: ( ?))([\+\(\)\d\s\-]+)~"
Все вроде нормально за исключением, напр., такого варианта:
Тел./факс: +375 (17) 252-18-66 - отдел сбыта.
Результат: +375 (17) 252-18-66 -
Т.е., символ " - " после номера
 

Alexandre

PHPПенсионер
А если номер без скобок и со знаком "+", то не работает
значить, группу в скобках сделать условной - поставить ? знак
Вообще-то знак + ставится перед кодом страны , т.е. для России это +7

Если используем для шаблона типа ... +375 (17) 252-18-66
то между группой "~([тел\.|тел.факс]:) и код номера, т.е. группа со скобками (17) ставим условную группу: (+\d+)? (или поробуй (\+\d+)? знак плюса в этом месте должен распознаваться как символ, а не как метасимвол. )
Если должен быть пробел, то ставим условную группу пробел ( ?)

-~{}~ 13.07.07 14:37:




для того, чтоб выделить несколько групп 252-18-66 , делается
(\d+-)+(\d+)
группа (\d+-) ловит повторения, оканчивающиеся на минус: 252- 18-
а группа (\d+) осуществляет замыкание: 66
Т.е., символ " - " после номера
чтоб не было символа - поле номера, регулярное выражение должно заканчиваться метасимволом \b - (разделитель) пробел или знак табуляции, начала строки и тд
 

dimagolov

Новичок
Есть по крайней мере под FF Skype Extention, который внедряет в странички скрипт, находящий номера телефонов и переделывает их в ссылки на скайп. скрип JavaSdcript, так что подсмотреть регулярку не составит труда. правда, он отрабатывает только если код страны корректный.
 

Alexandre

PHPПенсионер
Дима, тут главное важен процесс понимания, а не "решение любой ценой".
Мне важно, чтоб Yura допер, как их делать, и может через пол годика сам будет подсказывать на форуме.
 

dimagolov

Новичок
Автор оригинала: Alexandre
Дима, тут главное важен процесс понимания, а не "решение любой ценой".
Мне важно, чтоб Yura допер, как их делать, и может через пол годика сам будет подсказывать на форуме.
так для этого умную книгу прочитать надо чтобы разобраться и понять а не допереть до какого-то частного случая. как сказал один гуру, регулярки это способ мышления, а не просто параметры функции replace
 

WP

^_^
Это не способ мышления, это язык. А формат записи телефона довольно гибкий + контекстный поиск надо реализовать отдельно.
 
Сверху