|
|
|
| Долго уже бьюсь, но так и не решил свою проблему.
Ситуация такая:
Скрипт получает переменную $message примерно такого содержания
$message = "текст текст текст [d]2D5+8[/d] текст текст [d]1D4+1 текст[/d]";
|
Мне надо "вытащить" из этой сточки все что с "D" между пробелами (2D5+8 и 1D4+1) минуя основной текст, потом разбить на составляющие, например 2D5+8 на 2, 5 и 8, произвести счет, и запихать результат обратно на то место где мы выдернули "это" из строки, при этом кол-во комбинаций с "D" заранее неизвестно. Во как!
Пробовал через strrpos и explode. Но как-то "не пошло"
Не могли бы вы помочь. Хотя бы если комбинация встречается 1 раз. | |
|
|
|
|
|
|
|
для: 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) На часть вопросов можно было бы сразу ответить, если вы привели бы результирующую строку, т.е. что должно получится в конце всех преобразований... | |
|
|
|
|
|
|
|
для: 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. У вас на форуме есть "дыра" позволяющая редактировать свои сообщения даже если на них ответили, хотя это уже разговор для отдельной темы. | |
|
|
|
|
|
|
|
для: Artem S.
(04.10.2004 в 21:59)
| | Если никто не опередит постараюсь порадовать чем-нибудь к полуночи ближе :))) | |
|
|
|
|
|
|
|
для: 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 А ещё в назидание себе - раньше эта дыра позволяла редактировать чужие сообщения :))) | |
|
|
|
|
|
|
|
для: 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 результаты вычислений. | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: cheops
(05.10.2004 в 11:43)
| | ОГРОМНОЕ спасибо! Моей радости нет предела. Я думал, что никогда не закончу эту часть скрипта.
RESPECT | |
|
|
|