Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Регулярные выражения
 
 автор: Artem S.   (04.10.2004 в 21:12)   письмо автору
 
 

Долго уже бьюсь, но так и не решил свою проблему.
Ситуация такая:
Скрипт получает переменную $message примерно такого содержания
$message = "текст текст текст [d]2D5+8[/d] текст текст [d]1D4+1 текст[/d]";

Мне надо "вытащить" из этой сточки все что с "D" между пробелами (2D5+8 и 1D4+1) минуя основной текст, потом разбить на составляющие, например 2D5+8 на 2, 5 и 8, произвести счет, и запихать результат обратно на то место где мы выдернули "это" из строки, при этом кол-во комбинаций с "D" заранее неизвестно. Во как!
Пробовал через strrpos и explode. Но как-то "не пошло"
Не могли бы вы помочь. Хотя бы если комбинация встречается 1 раз.

   
 
 автор: cheops   (04.10.2004 в 21:47)   письмо автору
 
   для: Artem S.   (04.10.2004 в 21:12)
 

Задача действительно для регулярных выражений... но есть пару вопросов:
1) "все что с "D" между пробелами" эквивалентно ли это всё что между [d] и [/d] не включая пробелы
2) Формат загадочной формулы 2D5+8 остаётся постоянным, т.е. не появляются ли спонтанно прбелы между плюсом и цифрой, цифра всегда от 0 до 9 или может принимать значения больше 9.
3) Подсчёт ведётся в пределах одной комбинации 2D5+8 или нескольких, суммируются все цифры или только последние две, т.е. в этом случае первую можно и не извлекать....
4) "при этом кол-во комбинаций с "D" заранее неизвестно" - это в тексте или в пределах тэгов [d] и [/d], т.е. не появится ли что-нибудь вроде [d] 2D5+8 1D6+8 2D5+8 [/d]
5) На часть вопросов можно было бы сразу ответить, если вы привели бы результирующую строку, т.е. что должно получится в конце всех преобразований...

   
 
 автор: Artem S.   (04.10.2004 в 21:59)   письмо автору
 
   для: cheops   (04.10.2004 в 21:47)
 

1) Честно говоря я не написал [d] и [/d] вначале, а когда добавил, то забыл убрать эту сточку :) Вы правильно поняли.
2) Формат всегда постоянный, пробелов не должно быть, но значения могут быть и больше 9
3) Счет ведется для каждой комбинации в отдельности.
4) Нет. вложений быть не может.
5)
Вот пример. 2D5+8 не что иное как
for($i=0; $i<2; $i++) $sum = $sum+rand(1,5); //случ. число от 1 до 5
$sum = $sum + 8;
И в $message надо занести вместо 2D5+8 число из $sum

Буду очень рад, если сможете помочь, так как уже в рег. выражениях я ничего не смыслю.
P.S. У вас на форуме есть "дыра" позволяющая редактировать свои сообщения даже если на них ответили, хотя это уже разговор для отдельной темы.

   
 
 автор: cheops   (04.10.2004 в 22:07)   письмо автору
 
   для: Artem S.   (04.10.2004 в 21:59)
 

Если никто не опередит постараюсь порадовать чем-нибудь к полуночи ближе :)))

   
 
 автор: cheops   (04.10.2004 в 22:45)   письмо автору
 
   для: Artem S.   (04.10.2004 в 21:59)
 

Только с rand что-то не чисто, он же два параметра принимать должен?
<?php 
  
// текст для разбора
  
$message "текст текст текст [d] 2D5+8 [/d] текст текст [d]1D4+1 текст[/d]";
  
// функция обратного вызова
  
function summ_number($matches
  {
    
// как обычно: $matches[0] -  полное вхождение шаблона
    // $matches[1] - вхождение первой подмаски,
    // заключенной в круглые скобки, и так далее...
    
for($i=1$i<$matches[1]; $i++) $sum rand(1,$matches[2])+1//случ. число от 1 до 5
    
$sum $sum $matches[3];
    return 
$sum;
  }
  echo 
preg_replace_callback(
              
"|([0-9]+)D([0-9]+)\+([0-9]+)|i",
              
"summ_number",
              
$message);
?>

Только я так и не понял оставлять тэги [d] и [/d] в покое или нет...

PS Ага, это хорошо что вы её нашли :))) Я её для себя оставил и для тех, кто найдёт - для исправления орфоргафических ошибок...
PPS А ещё в назидание себе - раньше эта дыра позволяла редактировать чужие сообщения :)))

   
 
 автор: Artem S.   (05.10.2004 в 07:43)   письмо автору
 
   для: cheops   (04.10.2004 в 22:45)
 

Все получилось! Спасибо.
Но нельзя ли немного улучшить? Просто в данном случае он заменяет даже то что не стоит в кодах [d] и [/d], а когда заменяет, то [d] и [/d] не убирает. Ну вот пример

####### 2D5+8 ###### [d]2D5+8[/d] ####
на выходе должно дать, например
####### 2D5+8 ###### 15 ###### //не должно заменяться то, что не в кодах [d] и [/d]
а у вас
####### 11 ###### [d]15[/d] ###### //коды [d] и [/d] больше не нужны
Можете исправить?
P.S. Да с rand я напутал, и все уже исправил ; )
P.P.S. я тут немного поторопился, такого быть не должно [d]1D4+1 текст[/d], я имел в виду [d]1D4+1[/d] текст. И если можно, чтоб это было верно и при "d" маленьком.
--Добавленно--
P.P.P.S Э-э, как-то уже не ловко просить. Но нельзя ли строчку
"текст текст текст [d]2D5+8[/d] текст текст [d]1D4+1[/d] текст";
получить резултат как
"текст текст текст 2D5+8 = 15 текст текст 1D4+1 = 3 текст" //где 15 и 3 результаты вычислений.

   
 
 автор: cheops   (05.10.2004 в 11:43)   письмо автору
 
   для: Artem S.   (05.10.2004 в 07:43)
 

Тогда следует воспользоваться следующим вариантом
<?php 
  
// текст для разбора
  
$message "текст текст текст [d] 2D5+8 [/d] текст текст [D]1d4+1 [/D]";
  
// функция обратного вызова
  
function summ_number($matches
  {
    
// как обычно: $matches[0] -  полное вхождение шаблона
    // $matches[1] - вхождение первой подмаски,
    // заключенной в круглые скобки, и так далее...
    
for($i=1$i<$matches[2]; $i++) $sum rand(1,$matches[3])+1//случ. число от 1 до 5
    
$sum $sum $matches[4];
    
$result $matches[1]." = ".$sum;
    return 
$result;
  }
  echo 
preg_replace_callback(
              
"|\[d][\s]*(([0-9]+)D([0-9]+)\+([0-9]+))[\s]*\[/d]|i",
              
"summ_number",
              
$message);
?>

PS Выражение не зависит от регистра (модификатор i в конце) поэтому везде можно использовать как D, так и d.

   
 
 автор: Artem S.   (05.10.2004 в 18:39)   письмо автору
 
   для: cheops   (05.10.2004 в 11:43)
 

ОГРОМНОЕ спасибо! Моей радости нет предела. Я думал, что никогда не закончу эту часть скрипта.
RESPECT

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования