[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Регулярки
progred
Допустим, есть какой-то текст и в этом тексте есть заявки на подключение, каждая заявка с новой строки

Что из себя представляет заявка, например:

Циолковского 8-33 - Иванов Иван Иванович - 89515555555
Богдана Хмельницкого 62\3-32 - Иванова Марфа Матвеевна

Дак вот, мне нужно эти заявки вытащить из текста и, допустим вести поиск: улица|дом|квартира|ФИО|телефон|

Поиск уже полностью готов, вот только регулярка отказывается работать как надо.

Вот мои наработки:
define("FIND","/^([а-яА-ЯёЁ -.]+)[\s]+([^a-zA-Z%]+)[^%]+([^a-zA-Z%]+)[\-_.:;,– ]+([а-яА-ЯёЁ ]+)[\-_.:;,– ]+([\d]+)$/");

Помогите составить эффективное рег.выражение, которое будет выполнять поставленную задачу



Спустя 1 час, 28 минут, 10 секунд (12.04.2011 - 16:31) Ulan написал(а):
подробнее опишите формат входных данных. разделитель символ дефиса? дефис может встречаться в улице/фамилии? какие еще символы могут быть в строке?
зачем в вашем выражении символы [\-_.:;,– ]? какая кодировка данных?

Спустя 9 минут, 34 секунды (12.04.2011 - 16:41) Guest написал(а):
Цитата (Ulan @ 12.04.2011 - 13:31)
подробнее опишите формат входных данных. разделитель символ дефиса?

Принято ставить дефис, но люди разные, могут по разному заявки записывать, могут опечататься, поэтому думаю почти все видимые спецсимволы..

Цитата (Ulan @ 12.04.2011 - 13:31)
дефис может встречаться в улице/фамилии?

Да, конечно. Может встретиться и точка.
Например Б.Хмельницкого.

Цитата (Ulan @ 12.04.2011 - 13:31)

какие еще символы могут быть в строке?
зачем в вашем выражении символы [\-_.:;,– ]? какая кодировка данных?

Это я перечислил разделители, которые могут стоять между квартирой и ФИО, между ФИО и телефоном.

Кстати, ФИО может быть не полным, например: Иванов Иван или Иванов И.И. или Надежда Валерьевна.

Необходимо наиболее эффективное выражение, которое не оставит без внимания ни одной заявки

Спустя 10 минут, 28 секунд (12.04.2011 - 16:51) Guest написал(а):
Квартира также может быть: 2а, 82б

Спустя 29 минут, 22 секунды (12.04.2011 - 17:21) Ulan написал(а):
а также дом 2а, 82б smile.gif
а откуда приходят эти данные? на этапе ввода их разделить|отфильтровать нельзя?

Спустя 32 минуты, 10 секунд (12.04.2011 - 17:53) Guest написал(а):
Цитата (Ulan @ 12.04.2011 - 14:21)
а откуда приходят эти данные? на этапе ввода их разделить|отфильтровать нельзя?


В textarea вводятся все заявки с комментариями и со всякой лабудой.
На этапе ввода их разделять не надо, разделять надо только для поиска, т.к. все заявки (с лабудойuser posted image) впоследствии должны отправляться на заданный ящик.

Спустя 32 минуты, 15 секунд (12.04.2011 - 18:25) Ulan написал(а):
то есть предполагается, что пользователь будет сознательным, и напишет сначала улицу, а не фамилию? или дом с квартирой поменяет местами biggrin.gif
надежнее сделать отдельные поля для каждого вводимого значения, получить данные массивом и делать с ними потом все что угодно: проверить валидность, отправить на мыло, или склеить в строку используя заданный разделитель, или загнать в базу, и не пытаться учесть все возможные варианты правописания регуляркой.

Спустя 1 час, 32 минуты, 13 секунд (12.04.2011 - 19:57) Guest написал(а):
Цитата (Ulan @ 12.04.2011 - 15:25)
то есть предполагается, что пользователь будет сознательным, и напишет сначала улицу, а не фамилию? или дом с квартирой поменяет местами biggrin.gif
надежнее сделать отдельные поля для каждого вводимого значения, получить данные массивом и делать с ними потом все что угодно: проверить валидность, отправить на мыло, или склеить в строку используя заданный разделитель, или загнать в базу, и не пытаться учесть все возможные варианты правописания регуляркой.


У меня вопрос стоит не как проще, а как надо. Компании так нужно.
А я все сделал user posted image)))
Вроде все варианты пересмотрел.

Реализовал так:
define("FINDBID", "/^([^|]+[А-Яа-яёЁ.-]{2,}[-_.:;,– ]+[0-9]{5,11})([^|]{0,})\s{0,}$/");

define("FIND", "/^([А-Яа-я.-\s]{4,})[\s]+([0-9А-ЯёЁа-я\/]+)[-\s]{0,}([0-9Ёёа-яА-Я]{0,})[-\s]+([А-ЯЁа-яё.\s]{4,})[-\s]+([0-9]{5,11})[\s]{0,}$/");

Этот FINDBID ищет все возможные заявки, если соотв.шаблону, идет в бой уже FIND с более конкретным шаблоном) Если FIND шаблону не соответствует, то пишет: "Эти заявки не соответствуют шаблону. Исправьте пожалуйста!" и перечисляет их. Вот и все!) Это делается все на стадии добавления заявок. Реализовал типа предварительного просмотра)

Спустя 3 часа, 45 минут, 13 секунд (12.04.2011 - 23:43) Ulan написал(а):
ну что ж wink.gif
первое выражение совпадет со строкой ваня 954860
и первое и второе совпадет ул.Иванова И Иванович 954860

второе не найдет улицу 1-й гвардейской дивизии или 2-й Чистопрудный переулок

также не совпадет если составная фамилия
Циолковского 8-33 - Михаил Александрович Бонч-Бруевич - 89515555555

вообщем первое выражение бессмысленно, второе будет работать, если пользователи не введут чего-нибудь лишнего. например, запятую smile.gif

кстати, рекомендую http://gskinner.com/RegExr/
удобно регулярки проверять

Спустя 4 часа, 57 минут, 9 секунд (13.04.2011 - 04:40) Guest написал(а):
Цитата (Ulan @ 12.04.2011 - 20:43)
первое выражение совпадет со строкой ваня 954860
и первое и второе совпадет ул.Иванова И Иванович 954860


Конечно же, предполагается, что пользователь знает стандартный шаблон, т.к. пользоваться будут сотредники компании.

Цитата (Ulan @ 12.04.2011 - 20:43)
второе не найдет улицу 1-й гвардейской дивизии или 2-й Чистопрудный переулок

Делая для 2-x городов, здесь улиц с цифрами нет. Хотя зделать тоже нужно

Цитата (Ulan @ 12.04.2011 - 20:43)
также не совпадет если составная фамилия
Циолковского 8-33 - Михаил Александрович Бонч-Бруевич - 89515555555

Да, а вот с Бонч-Бруевичем надо что-то делать... Пусть я таких фамилий не встречал.

Цитата (Ulan @ 12.04.2011 - 20:43)
вообщем первое выражение бессмысленно, второе будет работать, если пользователи не введут чего-нибудь лишнего. например, запятую smile.gif


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

Спустя 14 часов, 34 минуты, 14 секунд (13.04.2011 - 19:14) walerus написал(а):
Как по мне, так лучше ОДИН раз написать нормальную форму, и не обучать ВЕСЬ персонал, что и как писать, то ли через тире, то ли через запятую...

По коду вместо textarea использовать массив, код переделать 2ве минуты делов...
вот примерно как.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<
html>
<
head>
<
title>Форма</title>
<
META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
</
head>
<
body>
<?
if (isset($_REQUEST['parse_form']) && trim($_REQUEST['parse_form'] == 'true'))
{
/* Получаем в итоге массив, где:
*[user_info] => Array
(
[0] => Город
[1] => Улица
[2] => Дом
[3] => Фамилия
[4] => Имя
[5] => Отчество
)

*
*/

// Проверяем

$user_info = $_REQUEST['user_info'];

if (trim($user_info[0]) == '')
echo 'Ошибка - НЕ введен город'."\n<br>";
elseif (trim($user_info[1]) == '')
echo 'Ошибка - НЕ введена Улица'."\n<br>";
elseif (trim($user_info[2]) == '')
echo 'Ошибка - НЕ введен Дом'."\n<br>";
elseif (trim($user_info[3]) == '')
echo 'Ошибка - НЕ введена Фамилия'."\n<br>";
elseif (trim($user_info[4]) == '')
echo 'Ошибка - НЕ введено Имя'."\n<br>";
elseif (trim($user_info[5]) == '')
echo 'Ошибка - НЕ введено Отчество'."\n<br>";
else
{
echo "<pre>";
print_r($user_info);
echo "</pre>";
}
}

else
{
?>
<form method="POST" action="">
<
table border="0">
<
tr>
<
td> Город: </td>
<
td> <input type="text" name="user_info[]" size="20"> </td>
</
tr>
<
tr>
<
td> Улица: </td>
<
td> <input type="text" name="user_info[]" size="20"> </td>
</
tr>
<
tr>
<
td> Дом: </td>
<
td> <input type="text" name="user_info[]" size="20"> </td>
</
tr>
<
tr>
<
td> Фамилия: </td>
<
td> <input type="text" name="user_info[]" size="20"> </td>
</
tr>
<
tr>
<
td> Имя: </td>
<
td> <input type="text" name="user_info[]" size="20"> </td>
</
tr>
<
tr>
<
td> Отчество: </td>
<
td> <input type="text" name="user_info[]" size="20"> </td>
</
tr>
</
table>
<
input type="hidden" name="parse_form" value="true"><br>
<
input type="submit" value="Send" name="B1"><input type="reset" value="Clear" name="B2">
</
form>
<?
}
?>
</body>
</
html>




Спустя 1 час, 38 минут, 17 секунд (13.04.2011 - 20:52) Guest написал(а):
walerus, спасибо конечно за твои старания, мог бы не расписывать весь код, я понял вашу мысль..

Но это не то:
1) Вбивается по одной заявке. Нужно, чтобы сразу несколько.
2) Между заявками может быть описана какая-нибудь информация по дому, допустим, примечания какие-нибудь..
3) версия с textarea приучает работника к хорошему тону оформления заявки

Считаете, что использую регулярки невозможно учесть всевозможные варианты?
Сейчас работает мой вариант, пока все нормально. Заявки проходят.
Сотрудники знают, как вбивать заявки правильно, до этого просто отсылали по почте, потом их там все перелопачивали, распределяли, куда-какие отправить.
Сайт все сам это делает и отправляет что куда надо.

Спустя 10 часов, 54 минуты, 1 секунда (14.04.2011 - 07:46) walerus написал(а):
Ну, работает - и ладненько rolleyes.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.