![]() |
![]() |
Cool 08.05.2004 - 11:35 |
Столкнулся с тривиальной задачей: надо увеличить на единицу число ответов в теме сообщения. Делаю это так: $str=ereg_replace("Ответ\[([0-9]+)\]","Ответ:[\\1+1]",$str); нифига... заменяет на N+1 . Попробовал делать "Ответ:[".((int)"\\1"+1)."]" - тоже нифига. Так как же \\1 увеличить на единицу? |
Уверенный 1 - 08.05.2004 - 12:18 | Такая задача обычно действительно тривиальная - берешь переменную и прибавляешь к ней единицу. А причем тут регэкспы? Ты что, в своем скрипте не знаешь номер последнего сообщения? |
Cool 2 - 08.05.2004 - 13:18 |
Как все просто-то, а? Нет, не знаю. Этот скрипт обрабатывает название темы, в системе приватных сообщений форума, поэтому номер надо вырезать из названия |
Mexoc 3 - 09.05.2004 - 00:02 |
Ну правильно, "Ответ:[\\1+1]" - строковая константа. Тебе нало сначала выдрать это число в переменную, увеличить ее а потом вставить. Например, у тебя есть строка $str="ответ: X" $str=explode(': ',$str); $str="ответ: ".++$str[1]; |
Cool 4 - 09.05.2004 - 00:13 | Я думал что можно как-нибудь это регэкспом провернуть, чтобы без всех этих работ со строками. Это-то понятно... а регэкспом никак, точно? |
Cool 5 - 09.05.2004 - 00:17 |
можно регэкспами %)) но это даже по моим меркам изврат! $str=ereg_replace("Ответ\[([0-9]+)\]","Ответ[".((int)ereg_replace("Ответ\[([0-9]+)\].+","\\1",$str)+1)."]",$str); |
Уверенный 6 - 09.05.2004 - 00:18 | Все равно не понимаю.. А название темы кто формирует, не скрипт, что ли? |
Cool 7 - 09.05.2004 - 10:59 |
Вот смотри... сидит какой-то человек, и пишет другому приват. Вбивает в поле "тема" допустим такое: "Привет тебе от меня". Получатель получает это письмо, жмет кнопку "Ответить", и в поле "тема" автоматически вписывается: "Ответ: Привет тебе от меня". Отправляет это дело. Получатель получает, и снова отвечает, на этот раз в поле тема вписывается "Ответ[2]: Привет тебе от меня". И т.д. "Ответ[3]: Привет тебе от меня" 4,5,6... |
Уверенный 8 - 10.05.2004 - 00:29 |
Т.е. ты не хранишь нигде (в базе, в файле) эти сообщения? Можно было бы перед выдачей формы для ввода очередного сообщения посчитать, сколько уже в этой ветке, и прибавить единицу. Ну а если не хранишь - тогда конечно, только это как-то странно на мой взгляд. Нужно хранить, хотя бы недолго. На перле бы было так: $subj =~ s/Ответ:\[(\d+)\]/'Ответ:['.($1+1).']'/e; |
DIVЕR 9 - 10.05.2004 - 20:20 |
Perl как обычно рулит в обработке текстовых данных =)))) А на PHP нефик извращаться!!! =)) А именно: if ( ereg( '^Ответ\[([[:digit:]]+)\](.*)$', $subj, $regs ) ) { $subj = 'Ответ[' . ++$regs[1] . ']' . $regs[2]; } else { if ( substr($subj, 0, 6) == 'Ответ:' ) { $subj = 'Ответ[2]: ' . $subj; } else { $subj = 'Ответ: ' . $subj; } } Не претендую на абсолютную оптимальность этого алгоритма, но всё же он делает всё просто и всё что надо (KISS - Keep It Simple, Stupid; основной принцип UNIX =)) ) Также просьба не пинать ногами если найдёте какую-нибудь синтаксическую ошибку, т.к. всё это - от руки, т.е. не проверялось и т.д..... Cool, не слишком увлекайся использованием регэкспов, особенно на чате!!... |
Уверенный 10 - 10.05.2004 - 22:01 |
>Perl как обычно рулит в обработке текстовых данных =)))) Кстати, над приведенным выражением пришлось потрудиться минут 10, пока нашел ключик /e и научился его применять. А так тоже добавляло "+1", получалось "Ответ: 1+1". |
DIVЕR 11 - 10.05.2004 - 22:05 | Уверенный, вот как полезно отвечать на всякие такие вот вопросики =))) |
DIVЕR 12 - 11.05.2004 - 00:05 |
oops, нашёл-таки я ошибку =)))) вместо $subj = 'Ответ[2]: ' . $subj; надо что-то типа $subj = 'Ответ[2]:' . substr( $subj, 6 ); можно, конечно, было это сделать более элегантно с помощью регэкспов, но тут уж вопрос быстродействия имхо... |
Уверенный 13 - 11.05.2004 - 00:25 | DIVЕR, так потому и отвечаю, на то, что мне интересно. :) |
DIVЕR 14 - 11.05.2004 - 03:09 | Уверенный, я в принципе тоже =) |
Mips 15 - 11.05.2004 - 13:30 |
$str="subject"; for ($i=0;$i<5;$i++){ if (strtolower(substr($str,0,2))!="re") $str="RE: ".$str; else $str=preg_replace("/^(Re)?(: )?(\[([0-9]+)\])?(: )?/mie","ucfirst(strtolower('\\1')).'['.(intval('\\4')+1).']\\2\\5' ",$str); echo $str."<br>"; } |
Cool 16 - 11.05.2004 - 19:07 | Ага, всем спасибо! |