К списку форумов К списку вопросов
[RegExp]::Тривиальное увеличение числа Re[N]
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
Ага, всем спасибо!

К списку вопросов на форуме Веб-дизайн

>>