Покинул форум
Сообщений всего: 4
Дата рег-ции: Янв. 2008 Откуда: Владивосток, Россия
Помог: 0 раз(а)
Господа. Подскажите какой-нить мануальчик по составлению шаблона, а то везде общая информация, а для меня это пока темный лес.
Вкратце ситуация. Есть база номеров телефонов. Могут быть XXXXXX (городской номер. 6 цифр не пугайтесь. Город у нас маленький =)) и сотовый XXXXXXXXXX (10 цифр т.е. без +7 или 8). Ежедневно скачивается несколько тысяч объявлений, где номер телефона может быть в любом формате.
Например XX XX XX или XXX - XXX или XXX XXX-XX XX. Вообщем у пользователей хватает смекалки как усложнить работу =) Доступа к редактированию ввода нет.
Вот и возникла необходимость выдергивать из объявления номера телефонов и потом убирая все посторонние символы сравнивать с "чистым" в базе. Так. Телефонов может быть несколько. И еще в объявлении телефон может быть в любом месте. Как в начале, так и в конце. Грамотно написать шаблон. Даже один пока не получается. Вот помощи и прошу.
Если пример - то вообще буду примного благодарен. Заранее спасибо.
evgenijj
Отправлено: 09 Января, 2008 - 18:35:06
Участник
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006 Откуда: Москва
Помог: 10 раз(а)
Ничего не понял.
Есть текст, и в тексте встречаются строки
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 - цифра, считаем номером телефона. Все остальное - нет. Тогда можно будет подумать.
Покинул форум
Сообщений всего: 4
Дата рег-ции: Янв. 2008 Откуда: Владивосток, Россия
Помог: 0 раз(а)
Так я про это и говорю. Есть список возможного написания телефонов в объявлении. Там просто на сайте идет подсчет кол-ва объявлений по телефону и соответственно все пишут телефоны как попало - лишь бы не платить =) Халява.
Почему на сайте стандартную форму не сделают - хз. Ну это их дело. Приходится за них это делать, но для других целей.
Делалось так.
В базе забито XXXXXX или XXXXXXXXXX. Т.е. только цифры.
Соответственно после этого в скачанном объявлении ищется соответствие $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})
evgenijj
Отправлено: 10 Января, 2008 - 09:56:50
Участник
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006 Откуда: Москва
Покинул форум
Сообщений всего: 4
Дата рег-ции: Янв. 2008 Откуда: Владивосток, Россия
Помог: 0 раз(а)
Спасибо огромное. Буду разбираться.
evgenijj
Отправлено: 10 Января, 2008 - 10:38:01
Участник
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006 Откуда: Москва
Помог: 10 раз(а)
Dantesik пишет:
Спасибо огромное. Буду разбираться.
([0-9]{3}) - три цифры
[^0-9]{0,2} - 0,1 или 2 символа, кроме цифр. Я беру как max именно два, потому что может быть дефис, а потом пробел или превод строки
([0-9]{3}) - три цифры
[^0-9]{0,2} - 0,1 или 2 символа, кроме цифр
([0-9]{2}) - две цифры
[^0-9]{0,2} - 0,1 или 2 символа, кроме цифр
([0-9]{2}) - две цифры
Это будет соответствовать
xxxxxxxxxx
xxx xxx xx xx
xxx-xxx-xx-xx
xxx xxxxxxx
xxx xxx-xx-xx
и т.п.
Номера городских
(?:[0-9]{3}[^0-9]{0,2}[0-9]{3})|(?:[0-9]{2}[^0-9]{0,2}[0-9]{2}[^0-9]{0,2}[0-9]{2})
или так: [0-9]{3}[^0-9]{0,2}[0-9]{3}
xxx-xxx
xxxxxx
xxx xxx
Или так [0-9]{2}[^0-9]{0,2}[0-9]{2}[^0-9]{0,2}[0-9]{2}
xx xx xx
xx-xx-xx
xxxxxx
Вот, начал объяснять, и понял, что в моем решении есть ошибка. Номер телефона
123-456-78-90 123-456-78-90
будет найден два раза - сначала как мобильный, потом как городской. Надо бы делать так: удалять из сообщения найденные номера мобильных, а уже потом в этом урезанном объявлении искать городские номера.
Покинул форум
Сообщений всего: 4
Дата рег-ции: Янв. 2008 Откуда: Владивосток, Россия
Помог: 0 раз(а)
Так-с.
Еще раз спасибо. Есть правда небольшой трабл.
Если добавить при поиске городского номера в начало и конец [^0-9]{0,2} это спасет от повтора:
Найден номер мобильного телефона: 6783452578
Найден номер городского телефона: 678345
Однако если номер будет записан, как 123-456-78-90
Выхватит 123-456, как городской, чего быть не должно.
Ну или 123 456-7788, 11-22-33.
Найдет три номера
сотовый 123 456-7788
городской 123-456
городской 11-22-33
array_search не подходит, ведь он на точное соответствие. Есть какая-нить функция? или по всему массиву бегать и делать strpos???
\n\n(Добавление)
Не обновил форум. Не заметил сообщение.
evgenijj
Отправлено: 10 Января, 2008 - 13:53:14
Участник
Покинул форум
Сообщений всего: 1212
Дата рег-ции: Авг. 2006 Откуда: Москва
Помог: 10 раз(а)
Вот еще один вариант - с исправлениями и дополнениями. После того, как я нашел мобильные номера, я вырезаю их из сообщения и потом ищу городские
Еще одно изменение - то что в качестве разделителя используется [^0-9]{0,3} а не [^0-9]{0,2} Шаблон [^0-9]{0,2} не находит соответствие если сразу после разделителя номера (например дефис) идет перевод строки. Возможно, это связано с тем, что в Windows новая строка \r\n. Вместе с дефисом - уже три.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.