[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: помогите подобрать решение задачи
tureg1
Привет ребята! Вопрос в следующем.

Есть скрипт который обрабатывает строку. Строку в которой есть некоторые идентификаторы, благодаря которым решается дальнейшее выполнение скрипта.
Строка, к примеру может иметь следующий вид:

bbnsk6 639. Привет, как дела?

Теперь по пунктам:

1. bbnsk - это префикс, он есть всегда
2. bbnsk6 - шестерка, это параметр который определяет, в какую группу попадет сообщение после точки (далее идентификатор рубрики)
3. 639. - параметр определяет, кому пойдет сообщение
4. Привет, как дела? - это само сообщение

Эту строку обрабатывает следующий кусок кода:


if ($rest_s == 'bbnsk1'){$cat = 1;}
if ($rest_s == 'bbnsk2'){$cat = 2;}
if ($rest_s == 'bbnsk3'){$cat = 3;}
if ($rest_s == 'bbnsk4'){$cat = 4;}
if ($rest_s == 'bbnsk5'){$cat = 5;}

if ($rest_s == 'bbnsk6'){
$cat = 6;
//--------- вырезаем id сообщения (то, что пред точкой)
$str=strpos($mess, ".");
$id_mess=substr($mess, 0, $str);
//---------- удалим пробелы из id, если они есть
$id_mess = trim($id_mess);
var_dump($id_mess);
//---------- вырежем текст сообщения
$posle_dot=strpos($mess, ".");
$mess_send=substr($mess, $posle_dot+1);

$query_n = "SELECT * FROM messages WHERE id='$id_mess'";


Все было отлично, пока вдруг не понадобилось в эту строку вставить еще один параметр, а именно еще один идентификатор. Этот параметр должен стоять после префикса и идентификатора рубрики, но перед 639.

к примеру строчка может выглядить так:

bbnsk6 54! 639. Привет, как дела?

Но тут проблема, в первом случае, точка после 639 служит для скрипта маяком, до куда надо обрезать строку. Восклиц. знак после 54, тоже может служить маяком, для выреза этого параметра (54). Суть проблемы в том, что параметр 54! не всегда будет существовать. В определенных случаях его может и не быть. И у меня встал вопрос, как же теперь обрабатывать эту строку. Если возможно этого параметра не будет в 50% случаев?
Обращаюсь к опытным за советом. возможно это скрипт можно как нибудь упростить?



Спустя 3 часа, 3 минуты, 40 секунд (11.09.2012 - 20:11) vagrand написал(а):
Формат строки задаете вы сами?

Спустя 5 минут, 32 секунды (11.09.2012 - 20:17) tureg1 написал(а):
не понял вопроса =/
порядок идентификаторов? если да, то можно изменить

Спустя 27 минут, 30 секунд (11.09.2012 - 20:44) vagrand написал(а):
Ну так посему бы вам тогда не сделать как-то так:

bbnsk|6|54|639|Привет, как дела?

и потом делать просто так:


$info = explode('|', $string);


?

Спустя 4 минуты, 7 секунд (11.09.2012 - 20:48) tureg1 написал(а):
слишком сложно, нужно максимально упростить саму строку, так как ее набирают обычные пользователи сайта (смс на телефоне)

Спустя 3 минуты, 56 секунд (11.09.2012 - 20:52) Игорь_Vasinsky написал(а):
это самое простое)

Спустя 2 минуты, 55 секунд (11.09.2012 - 20:55) vagrand написал(а):
tureg1
Цитата
слишком сложно, нужно максимально упростить саму строку, так как ее набирают обычные пользователи сайта (смс на телефоне)


Тогда можно не через | а через точку например

Спустя 15 минут, 19 секунд (11.09.2012 - 21:10) tureg1 написал(а):
Цитата (vagrand @ 11.09.2012 - 17:55)
tureg1
Цитата
слишком сложно, нужно максимально упростить саму строку, так как ее набирают обычные пользователи сайта (смс на телефоне)


Тогда можно не через | а через точку например

я изначально рассматривал этот вариант smile.gif
но ведь сама загвостка в том, что этот новый параметр будет не всегда в этой строке, вот в чем вопрос smile.gif
как научить скрипт определять этот параметр, если он есть в строке? а если его нет, то обработать по старому принципу, как обрабатывается сейчас

Спустя 32 минуты, 6 секунд (11.09.2012 - 21:43) Shuriken написал(а):
Цитата (tureg1 @ 11.09.2012 - 18:10)


Тогда можно не через | а через точку например [/QUOTE]
я изначально рассматривал этот вариант smile.gif
но ведь сама загвостка в том, что этот новый параметр будет не всегда в этой строке, вот в чем вопрос smile.gif
как научить скрипт определять этот параметр, если он есть в строке? а если его нет, то обработать по старому принципу, как обрабатывается сейчас

Сделай так, как написал тебе vagrand: переведи строку в массив, а потом ты можешь посчитать кол-во элементоа масиива, из чего сделать вывод есть этот параметр или нет.

Спустя 2 часа, 45 минут, 3 секунды (12.09.2012 - 00:28) walerus написал(а):
$string = 'bbnsk6 54! 639. Привет, как дела? У меня все нормально. А у тебя ?';
$string_1 = 'bbnsk6 639. Привет, как дела? У меня все нормально. А у тебя ?';

function getData( $string = '' )
{
if ( $string == '' )
return array();

preg_match( '~^bbnsk(.*)\.\s(.*)$~iUsu', $string, $match );

// 1. bbnsk - это префикс, он есть всегда
$result = array( 'prefix' => 'bbnsk' );

$tmp = explode( ' ', $match[1] );
if ( count( $tmp ) > 2 )
{
$result['group'] = $tmp[0];
$result['param_54!'] = str_replace( '!', '', $tmp[1] );
$result['send_parametr'] = str_replace( '!', '', $tmp[2] );
$result['message_body'] = trim( $match[2] );
}
else
{
$result['group'] = $tmp[0];
$result['param_54!'] = '';
$result['send_parametr'] = str_replace( '!', '', $tmp[1] );
$result['message_body'] = trim( $match[2] );
}

return $result;
}

print_r( getData( $string ) );
print_r( getData( $string_1 ) );

Результат:
Array
(
[prefix] => bbnsk
[group] => 6
[param_54!] => 54
[send_parametr] => 639
[message_body] => Привет, как дела? У меня все нормально. А у тебя ?
)
Array
(
[prefix] => bbnsk
[group] => 6
[param_54!] =>
[send_parametr] => 639
[message_body] => Привет, как дела? У меня все нормально. А у тебя ?
)

Спустя 7 часов, 47 минут, 48 секунд (12.09.2012 - 08:15) tureg1 написал(а):
walerus отличное решение, мне понравилась твоя идея :)

но вот только результат у меня выводится другой:


Array
(
[
prefix] => bbnsk
[group] =>
[
param_54!] =>
[
send_parametr] =>
[
message_body] =>
)

Array
(
[
prefix] => bbnsk
[group] =>
[
param_54!] =>
[
send_parametr] =>
[
message_body] =>
)



Почему то пустой

Спустя 8 минут, 4 секунды (12.09.2012 - 08:23) Игорь_Vasinsky написал(а):
потому что его пример для юникода, а ты видимо в анси работаешь.

Спустя 9 минут, 23 секунды (12.09.2012 - 08:33) tureg1 написал(а):
Игорь_Vasinsky да ты прав, перевел в уникод и все появилось smile.gif всплыл вопрос, как заставить работать этот код в анси?

Спустя 1 минута, 45 секунд (12.09.2012 - 08:35) Игорь_Vasinsky написал(а):
можно было в регулярке модификатор u убрать biggrin.gif

Спустя 6 минут, 29 секунд (12.09.2012 - 08:41) tureg1 написал(а):
Спасибо большое ребята за помощь, все отлично получилось! smile.gif

Спустя 11 минут, 31 секунда (12.09.2012 - 08:53) tureg1 написал(а):
а как после выполнения этой функции выдернуть все эти переменные из массива?

Спустя 32 минуты, 26 секунд (12.09.2012 - 09:25) tureg1 написал(а):
разобрался, с помощью extract($tmp);

Спустя 1 час, 1 минута, 50 секунд (12.09.2012 - 10:27) walerus написал(а):
You're welcome cool.gif

Спустя 1 час, 58 минут, 37 секунд (12.09.2012 - 12:25) inpost написал(а):
tureg1
Массив = набор переменных.
Когда я открываю мой чемоданчик с инструментами (массив), то в нём лежат все мои инструменты (элемент массива - самостоятельная переменная с порядковым номером по ключу!). Всё сгруппировано!
А если использовать extract, то в итоге получится, что в зале отвертка, в спальне молоток, а гаечный ключ вообще в холодильнике. Ты так хочешь программировать?!

Спустя 12 минут, 14 секунд (12.09.2012 - 12:38) tureg1 написал(а):
inpost наставь на путь истинный smile.gif подскажи правильный вариант

Спустя 5 минут, 7 секунд (12.09.2012 - 12:43) inpost написал(а):
$data = getData( $string );
echo $data['group']; // вместо echo $group; !!!

Спустя 22 минуты, 31 секунда (12.09.2012 - 13:05) tureg1 написал(а):
inpost спс

Спустя 30 минут, 51 секунда (12.09.2012 - 13:36) tureg1 написал(а):
в общем я рад, что код стал проще чем был :) вот, что сейчас он из себя представляет:


$data = getData( $mess_neobrabot );
$cat = $data['group'];
$ref = $data['param_54!'];
$id_mess = $data['send_parametr'];
$mess = $data['message_body'];

$now = date("Y-m-d H:i:s");
$rest_s = strtolower($rest);


if ($cat == '6'){

$query_n = "SELECT * FROM messages WHERE id='$id_mess'";

//--- Тут другой кусок кода (не имеющий отношения к задачке)

}



он стал более понятен, чем изначальный вариант
ну и сама функция:


function getData( $string = '' )
{
if ( $string == '' )
return array();

preg_match( '~^bbnsk(.*)\.\s(.*)$~iUs', $string, $match );


$result = array( 'prefix' => 'bbnsk' );

$tmp = explode( ' ', $match[1] );
if ( count( $tmp ) > 2 )
{
$result['group'] = $tmp[0];
$result['param_54!'] = str_replace( '!', '', $tmp[1] );
$result['send_parametr'] = str_replace( '!', '', $tmp[2] );
$result['message_body'] = trim( $match[2] );

}
else
{
$result['group'] = $tmp[0];
$result['param_54!'] = '';
$result['send_parametr'] = str_replace( '!', '', $tmp[1] );
$result['message_body'] = trim( $match[2] );
}

return $result;
}



И я уже был безумно рад, пока не встретилась еще одна проблемка =/
Я запутался, я бы мог оставить все как есть (работать будет), но нужно все таки код сделать правильным :)

Дело в том, что параметр-переменная $id_mess, так же как и $ref может присутствовать в теле сообщения, а может и не присутствовать, в связи с этим функцию getData нужно доделать, но как сделать третье условие? И как правильно его сформировать?

Ведь получается, что изначальная строка может быть следующих видов:

1. bbnsk6 54! 639. Привет. Как дела?

2. bbnsk6 639. Привет. Как дела?

3. bbnsk1 54! Привет. Как дела?

4. bbnsk1 Привет. Как дела?

Проблема в том, что сейчас getData в случаем с 3 и 4 вариантами строки, обрежет строку до точки.

Спустя 13 минут, 24 секунды (12.09.2012 - 13:50) inpost написал(а):
Опять тот же бред.
Зачем тебе всё это?:
$cat = $data['group'];
$ref = $data['param_54!'];
$id_mess = $data['send_parametr'];
$mess = $data['message_body'];

работай непосредственно с массивом!!
$query_n = "SELECT * FROM messages WHERE id='".(int)$data['message_body']."'";


А вот зачем тебе такой бред с этой строкой... откуда она вообще формируется? Почему твоя строка имеет постоянно разный вид?

Если это из таблицы mess, то храни не одно поле "text", а 4 ячейки.

Спустя 13 минут, 53 секунды (12.09.2012 - 14:03) tureg1 написал(а):
Этот бред нужен для того, что бы вставлять все переменные в таблицу с ячейками
Вот запрос который это делает, я его ранее не писал, так как он никакого отношения к задачи не имеет


$query = "INSERT INTO `messages` VALUES ('NULL', '$cat', '$timeHN:$timeI', '$dateT.$datem', '$mess', '$number', 'vip', '$now')";


исходя из этой таблицы, формируется другая страница на сайте с данными из этой базы (которая тоже не имеет отношения к данной задачи :))

хотя, мне тут одна идея пришла, сейчас ее попробую и отпишусь

Спустя 21 минута, 45 секунд (12.09.2012 - 14:25) tureg1 написал(а):
моя идея не работает, но чувствую я где то рядом

думал если функцию переделать так то проблема будет решена, не решил, в чем мои ошибки?


function getData( $string = '' )
{
if ( $string == '' )
return array();

preg_match( '~^bbnsk(.*)\.\s(.*)$~iUs', $string, $match );


$result = array( 'prefix' => 'bbnsk' );

$tmp = explode( ' ', $match[1] );
if ( count( $tmp ) > 2 )
{
$result['group'] = $tmp[0];
$result['param_54!'] = str_replace( '!', '', $tmp[1] );
$result['send_parametr'] = str_replace( '!', '', $tmp[2] );
$result['message_body'] = trim( $match[2] );

};
if ( count( $tmp ) > 1 )
{
$result['group'] = $tmp[0];
$result['param_54!'] = '';
$result['send_parametr'] = str_replace( '!', '', $tmp[1] );
$result['message_body'] = trim( $match[2] );
};
if ( count( $tmp ) > 1 )
{
$result['group'] = $tmp[0];
$result['param_54!'] = str_replace( '!', '', $tmp[1] );
$result['send_parametr'] = '';
$result['message_body'] = trim( $match[2] );
};
if ( count( $tmp ) > 0 )
{
$result['group'] = $tmp[0];
$result['param_54!'] = '';
$result['send_parametr'] = '';
$result['message_body'] = trim( $match[2] );
};

return $result;
}

Спустя 13 минут, 25 секунд (12.09.2012 - 14:39) inpost написал(а):
$query = "INSERT INTO `messages` VALUES ('NULL', '$cat', '$timeHN:$timeI', '$dateT.$datem', '$mess', '$number', 'vip', '$now')";

Удаляем и делаем:
$query = "INSERT INTO `messages` SET 
`cat` = '"
.$data['cat']."',
...
`date` = NOW()
"
;


Спустя 12 минут, 5 секунд (12.09.2012 - 14:51) tureg1 написал(а):
inpost я понял наконец то твою мысль, типа нахрена я создавал лишнии переменные, если значения сразу можно впихнуть в базу из массива :) верно?

просто я с массивами имею мало опыта, поэтому делал так как делал

запрос стал таким:


$query = "INSERT INTO `messages` SET
`rubrika` = '"
.$data['group']."',
`time` = '
$timeHN:$timeI',
`date` = '
$dateT.$datem',
`mess` = '"
.$data['message_body']."',
`number` = '
$number',
`vip` = 'vip',
`datetime` = NOW()
"
;


Правильность мы сделали, но ушли от главной задачи :)

Что же делать с функцией getData, мои условия не работаю =/

Спустя 1 час, 24 минуты, 51 секунда (12.09.2012 - 16:16) inpost написал(а):
Ты не там сейчас находишься. Почему тебе приходится разлаживать такую сложную строку, как ты показал? Откуда она формируется?

Спустя 22 минуты, 31 секунда (12.09.2012 - 16:38) tureg1 написал(а):
ок, сейчас расскажу откуда берется эта строка smile.gif

bbnsk6 54! 639. Привет, как дела?

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

54 - это ID реферала преведенного посетителя на сайт

639 - на сайте есть функция, которая позволяет любому посетителю, ответить смс сообщением, прямо на телефон другого пользователя сайта, оставившего это сообщение. по этому параметру определяется на какой номер слать смс. Этот параметр есть в строке, только тогда когда bbnsk заканчивается на шетерку, тоесть bbnsk6

Привет, как дела? - Это сообщение которое попадет в определенную рубрику (bbnsk1-2-3-4-5) или же уйдет смс-сообщением на другой номер телфона (bbnsk6).

Эта строка является смс сообщением от посетителей.

Почему содержание строки меняется?

1. Потому что, посетитель на сайт может прийти не по рефереральной ссылке - значит будет отсутствовать параметр 54!

2. Потому что, посетитель может написать сообщение в рубрику, а не другому пользователю. В таком случае, параметр 639. Тоже будет отсутствовать.

3. Потому что, посетитель может быть пришедшим от реферала и может написать
сообшение другому пользователю. В данном случае будут присудствовать оба идентификатора - 54! и 639.

Вроде понятно объяснил smile.gif
Для наглядности могу оставить ссылку на этот сайт http://154fm.ru

в этом топике я пытаюсь создать систему, которая будет определять какие смс пришли от пользователей реферала и в какую категорию они будут отправленны. Другими словами, пишу партнерскую программу для своего сайта smile.gif

Спустя 7 минут, 52 секунды (12.09.2012 - 16:46) inpost написал(а):
Надо разделить реферал и число. Разделение, как я понял, это символ? ! или . ? Или как?

Спустя 10 минут, 56 секунд (12.09.2012 - 16:57) tureg1 написал(а):
Да, именно
! - показывает где заканчивается ID реферала
. - показывает где заканчивается ID сообщения, оставленного абонентом

функция getData от walerus, отлично подходила для этого дела, пока я не понял вдруг, что параметр 639. тоже может быть, а может и не быть. Вопрос остался только в том, как обрабатывать эту строку при наличии или отсутствии эти параметров или одного из них?

Спустя 6 минут, 32 секунды (12.09.2012 - 17:03) inpost написал(а):
if(preg_match('#\!$#iusU',$text)) {
$text // Заканчивается восклицательным знаком.
}

И аналогично. Разбей explode по пробелу, далее прогони циклом foreach и проверь двумя регулярками на последний символ. В примере выше -восклицательный знак.

Спустя 5 минут, 22 секунды (12.09.2012 - 17:09) tureg1 написал(а):
inpost а я правильно понял, что в данном случае придется ставить еще один новый символ-разделение перед сообщением от пользователя, потому что само сообщение будет тоже содержать пробелы?

Спустя 7 минут, 14 секунд (12.09.2012 - 17:16) inpost написал(а):
Реф.ссылку и id- ты сам задаёшь вид? Или обязательно 37! ?

Спустя 1 минута, 18 секунд (12.09.2012 - 17:17) tureg1 написал(а):
да, задаю сам. Есть какое то решение? smile.gif

Спустя 2 минуты, 40 секунд (12.09.2012 - 17:20) inpost написал(а):
Спец.символы используй в виде кода.
%r_17%
%id_66%

Отсюда можно будет вытащить (из строки) этот шифр.
$patern = "#\%r\_(\d+)\%#iusU";
- и в кармашек в случае успеха получишь данное значение, и из кармашка перебросишь в нужную тебе переменную.

Спустя 2 часа, 41 минута, 15 секунд (12.09.2012 - 20:01) tureg1 написал(а):
Цитата (inpost @ 12.09.2012 - 14:20)
Отсюда можно будет вытащить (из строки) этот шифр.
$patern = "#\%r\_(\d+)\%#iusU";
- и в кармашек в случае успеха получишь данное значение, и из кармашка перебросишь в нужную тебе переменную.

вот так я и познакомился с регулярными выражениями :)
продуктивный день сегодня

inpost, что за код? где можно прочитать про него? не могу найти

Спустя 55 минут, 16 секунд (12.09.2012 - 20:57) inpost написал(а):
tureg1
Я показал тебе патерн для регулярного выражения. smile.gif Надо бы тебе разобрать его и понять смысл, что я хотел донести. Хоть патерн и рабочий, но всё же логику должен сам понимать.

Спустя 6 минут, 58 секунд (12.09.2012 - 21:03) tureg1 написал(а):
я поступил немного по другому :) после твоего сообщения про карманы, я начал курить регулярные выражения :)

Прочитал вот эту очень доходчивую статейку http://phpclub.ru/detail/article/regexp_1

Она открыла мне глаза на многое, честно я раньше и не догадывался, что в PHP есть такая замечательная возможность.

Потом, исходя из новых полученных знаний, я написал большой скрипт. Он получился громоздким, НО рабочим! :) Я догадываюсь, что возможно он написан не правильно, и возможно было сделать проще, но я сейчас в состоянии эйфории от того, что он работает во всех возможных вариантов состава строки (а их всего четыре) :) inpost, просьба прокомментировать данный кусок кода


$string = 'bbnsk6 567! 178. Привет, как дела?';

if (preg_match( '/^([a-zA-Z]{5})([1-6])\s+([0-9]{1,4}!)\s+([0-9]{3,5}\.)\s+(.*)$/iUs', $string, $match ))
{
$pref = $match[1];
$cat = $match[2];
$ref = str_replace( '!', '', $match[3] );
$id_mess = str_replace( '.', '', $match[4] );
$mess = trim( $match[5] );

echo "Префикс: $pref<br>";
echo "Категория: $cat<br>";
echo "Реферал: $ref<br>";
echo "Адресат: $id_mess<br>";
echo "Сообщение: $mess<br>";
echo "<br>С рефералом и адресатом.<br><br>";

};

if (preg_match( '/^([a-zA-Z]{5})([1-6])\s+([0-9]{1,4}!)\s+([^0-9]{3,5}.*)$/iUs', $string, $match ))
{
$pref = $match[1];
$cat = $match[2];
$ref = str_replace( '!', '', $match[3] );
//$id_mess = str_replace( '.', '', $match[4] );
$mess = trim( $match[4] );

echo "Префикс: $pref<br>";
echo "Категория: $cat<br>";
echo "Реферал: $ref<br>";
echo "Адресат: $id_mess<br>";
echo "Сообщение: $mess<br>";
echo "<br>С рефералом без адресата.<br><br>";
};

if (preg_match( '/^([a-zA-Z]{5})([1-6])\s+([0-9]{3,5}[^!])\s+(.*)$/iUs', $string, $match ))
{
$pref = $match[1];
$cat = $match[2];
//$ref = str_replace( '!', '', $match[3] );
$id_mess = str_replace( '.', '', $match[3] );
$mess = trim( $match[4] );

echo "Префикс: $pref<br>";
echo "Категория: $cat<br>";
echo "Реферал: $ref<br>";
echo "Адресат: $id_mess<br>";
echo "Сообщение: $mess<br>";
echo "<br>Без реферала с адресатом.<br><br>";
};

if (preg_match( '/^([a-zA-Z]{5})([1-6])\s+([^0-9!].*)$/iUs', $string, $match ))
{
$pref = $match[1];
$cat = $match[2];
//$ref = str_replace( '!', '', $match[3] );
//$id_mess = str_replace( '.', '', $match[3] );

$mess = trim( $match[3] );

echo "Префикс: $pref<br>";
echo "Категория: $cat<br>";
echo "Реферал: $ref<br>";
echo "Адресат: $id_mess<br>";
echo "Сообщение: $mess<br>";
echo "<br>Без реферала и без адресата.<br><br>";
};


Спустя 49 минут, 48 секунд (12.09.2012 - 21:53) Ser18 написал(а):
Можно при формировании строки, там где нет значений писать ноль, записать в массив и в зависимости где нули выполнять нужное действие
bbnsk6 0! 0. Привет, как дела?

Спустя 27 минут, 21 секунда (12.09.2012 - 22:21) inpost написал(а):
tureg1
Если работает, то нет смысла переживать. Главное тесты лучше проводить!

Спустя 1 минута, 5 секунд (12.09.2012 - 22:22) tureg1 написал(а):
Цитата (Ser18 @ 12.09.2012 - 18:53)
Можно при формировании строки, там где нет значений писать ноль, записать в массив и в зависимости где нули выполнять нужное действие
bbnsk6 0! 0. Привет, как дела?

Это кстати тоже вариант. Но дело в том, что лучше эту строку, упростить как можно сильнее, то есть убрать все лишнее. Потому как люди набирают ее в смс сообщении. Поэтому, лучше будет, что бы хотя бы в некоторых случаях тело смс было простым
Быстрый ответ:

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