Господа. Подскажите какой-нить мануальчик по составлению шаблона, а то везде общая информация, а для меня это пока темный лес.
Вкратце ситуация. Есть база номеров телефонов. Могут быть XXXXXX (городской номер. 6 цифр не пугайтесь. Город у нас маленький =)) и сотовый XXXXXXXXXX (10 цифр т.е. без +7 или 8). Ежедневно скачивается несколько тысяч объявлений, где номер телефона может быть в любом формате.
Например XX XX XX или XXX - XXX или XXX XXX-XX XX. Вообщем у пользователей хватает смекалки как усложнить работу =) Доступа к редактированию ввода нет.
Вот и возникла необходимость выдергивать из объявления номера телефонов и потом убирая все посторонние символы сравнивать с "чистым" в базе. Так. Телефонов может быть несколько. И еще в объявлении телефон может быть в любом месте. Как в начале, так и в конце. Грамотно написать шаблон. Даже один пока не получается. Вот помощи и прошу.
Если пример - то вообще буду примного благодарен. Заранее спасибо.
1. Dantesik - 09 Января, 2008 - 17:23:51 - перейти к сообщению
2. evgenijj - 09 Января, 2008 - 18:35:06 - перейти к сообщению
Ничего не понял.
Есть текст, и в тексте встречаются строки
123456
12 34 56
12-34-56
1234567890
123 456-78-90
(123) 4567890
123-456-78-90
(123) 4567890
Вполне возможно, с ошибками
(123 4567890
123) 456-78-90
А еще какой-нибудь оригинал напишет
123*456*78*90
Я вообще немного разбираюсь в рег. выражениях, но за такую задачу не возмусь: "Пойди туда, не знаю куда, принеси то, не знаю что."
Надо формализовать задачу. Например, все, что имеет формат
xxxxxx
xx-xx-xx
xx xx xx
xxxxxxxxxx
xxx-xxx-xx-xx
xxx xxx xx xx
xxx xxx-xx-xx
xxx xxx-xxxx
где x - цифра, считаем номером телефона. Все остальное - нет. Тогда можно будет подумать.
Есть текст, и в тексте встречаются строки
123456
12 34 56
12-34-56
1234567890
123 456-78-90
(123) 4567890
123-456-78-90
(123) 4567890
Вполне возможно, с ошибками
(123 4567890
123) 456-78-90
А еще какой-нибудь оригинал напишет
123*456*78*90
Я вообще немного разбираюсь в рег. выражениях, но за такую задачу не возмусь: "Пойди туда, не знаю куда, принеси то, не знаю что."
Надо формализовать задачу. Например, все, что имеет формат
xxxxxx
xx-xx-xx
xx xx xx
xxxxxxxxxx
xxx-xxx-xx-xx
xxx xxx xx xx
xxx xxx-xx-xx
xxx xxx-xxxx
где x - цифра, считаем номером телефона. Все остальное - нет. Тогда можно будет подумать.
3. Dantesik - 09 Января, 2008 - 23:41:25 - перейти к сообщению
Так я про это и говорю. Есть список возможного написания телефонов в объявлении. Там просто на сайте идет подсчет кол-ва объявлений по телефону и соответственно все пишут телефоны как попало - лишь бы не платить =) Халява.
Почему на сайте стандартную форму не сделают - хз. Ну это их дело. Приходится за них это делать, но для других целей.
Делалось так.
В базе забито XXXXXX или XXXXXXXXXX. Т.е. только цифры.
Почему на сайте стандартную форму не сделают - хз. Ну это их дело. Приходится за них это делать, но для других целей.
Делалось так.
В базе забито XXXXXX или XXXXXXXXXX. Т.е. только цифры.
CODE (text):
скопировать код в буфер обмена
скопировать код в буфер обмена
- //Для сотовых
- preg_match("|([0-9]{3})([0-9]{3})([0-9]{2})([0-9]{2})|i",$zap['telef'], $r1);
- //xxx-xxx-xx-xx
- $pat[0] = $r1[1].$r1[2].$r1[3].$r1[4];
- $pat[1] = $r1[1].' '.$r1[2].' '.$r1[3].' '.$r1[4];//xxx xxx xx xx
- $pat[2] = $r1[1].' '.$r1[2].' '.$r1[3].'-'.$r1[4];//xxx xxx xx-xx
- $pat[3] = $r1[1].' '.$r1[2].'-'.$r1[3].'-'.$r1[4];//xxx xxx-xx-xx
- $pat[4] = $r1[1].'-'.$r1[2].'-'.$r1[3].'-'.$r1[4];//xxx-xxx-xx-xx
- $pat[5] = $r1[1].' '.$r1[2].$r1[3].$r1[4];//xxx xxxxxxx
- $pat[6] = $r1[1].'-'.$r1[2].$r1[3].$r1[4];//xxx-xxxxxxx
- $pat[7] = $r1[1].' '.$r1[2].' '.$r1[3].$r1[4];//xxx xxx xxxx
- $pat[8] = $r1[1].' '.$r1[2].'-'.$r1[3].$r1[4];//xxx xxx-xxxx
- $pat[9] = $r1[1].'_'.$r1[2].'_'.$r1[3].$r1[4];//xxx_xxx_xxxx
- //Для городских
- preg_match("|([0-9]{2})([0-9]{2})([0-9]{2})|i",$zap['telef'], $r1);
- preg_match("|([0-9]{3})([0-9]{3})|i",$zap['telef'], $r2);
- //xx-xx-xx
- $pat[0] = $r1[1].$r1[2].$r1[3];
- $pat[1] = $r1[1]." ".$r1[2]." ".$r1[3];
- $pat[2] = $r1[1]."-".$r1[2]."-".$r1[3];
- $pat[3] = $r1[1].' — '.$r1[2].' — '.$r1[3];
- $pat[4] = $r1[1].'—'.$r1[2].'—'.$r1[3];
- //xxx-xxx
- $pat[5] = $r2[1]." ".$r2[2];
- $pat[6] = $r2[1].'-'.$r2[2];
- $pat[7] = $r2[1].' — '.$r2[2];
- $pat[8] = $r2[1].'—'.$r2[2];
- //xx-xxxx
- $pat[9] = $r1[1].' '.$r1[2].$r1[3];
- $pat[10] = $r1[1].'-'.$r1[2].$r1[3];
- $pat[11] = $r1[1].'—'.$r1[2].$r1[3];
- $pat[12] = $r1[1].' — '.$r1[2].$r1[3];
- //xxxx-xx
- $pat[13] = $r1[1].$r1[2].' '.$r1[3];
- $pat[14] = $r1[1].$r1[2].'-'.$r1[3];
- $pat[15] = $r1[1].$r1[2].'—'.$r1[3];
- $pat[16] = $r1[1].$r1[2].' — '.$r1[3];
Соответственно после этого в скачанном объявлении ищется соответствие $pat. И так несколько тысяч раз пробегая по базе телефонов пока соответствие не найдено или база не кончилась. На мой взгляд - не рационально. Однако времени было в обрез и выбирать не приходилось (с php 1 раз работал =)).
Теперь по данным шаблонам можно выдернуть сам телефон из объявления и искать соответствие mysql запросом. Мне кажеться будет намного быстрее =).
Так немного поколдовал для городских вот что получилось
([0-9]{1}[^0-9]{1,3}[0-9]{5}) |
([0-9]{5}[^0-9]{1,3}[0-9]{1}) |
([0-9]{3}[^0-9]{1,3}[0-9]{3}) |
([0-9]{2}[^0-9]{0,3}[0-9]{2}[^0-9]{0,3}[0-9]{2})