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

Форум PHP

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

 

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

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

тема: Идентификатор спойлера
 
 автор: devil943   (04.01.2008 в 01:16)   письмо автору
 
 

Возникла проблема. Сделал бб коды на сайте, в том числе спойлеры.
Юзер набивает сообщение и замещает коды, вместе с кодами сообщение пишется в базу данных, в при выводе регулярное выражение обрабатывает его.

Вот собственно обработка спойлера:


$replacment = "<div id=\"sp_open_$spoiler\" style=\"display:block\"><a href=\"javascript:open_close($spoiler)\">Показать спойлер</a></div>";
    $replacment .= "<div id=\"sp_close_$spoiler\" style=\"display:none\"><a href=\"javascript:open_close($spoiler)\">Скрыть спойлер</a></div>";
    $replacment .= "<div id=\"sp_$spoiler\" class=\"spoiler\" style=\"display:none\">";
    $spoiler = $spoiler +1;
    $text = preg_replace($patern, $replacment, $text);


Проблема в том, что если в сообщении будет два или более спойлера или они будут вложены у них будет одинаковый идентификатор. В этом-то и проблема. Я уже два дня голову муштрую, приходят либо через чур глобальные идеи с созданием таблицы с идентификаторами спойлеров (ИМХО бред), либо вообще сделать по другому (например блок, при наведении на который будет меняться цвет, который до этого совпадал с цветом фона. При этом в качестве id можно будет использовать this

Короче спасайте человека!

   
 
 автор: Trianon   (04.01.2008 в 09:48)   письмо автору
 
   для: devil943   (04.01.2008 в 01:16)
 

Что такое спойлер?
А то у меня над задней дверью висит одноименная конструкция (и сильно облегчает жизнь, кстати), но вот каким боком она к web-программированию, я не въезжаю однозначно.

   
 
 автор: sim5   (04.01.2008 в 09:58)   письмо автору
 
   для: Trianon   (04.01.2008 в 09:48)
 

Обычно спойлер — выдвижная или фиксированная металлическая пластинка, устанавливаемая поперёк потока воздуха для улучшения устойчивости автомобиля. А еще в авиации (вроде бы) спойлеры — тормозные щитки на закрылках. А если по переводу — портить, баловать..., то полная лажа получается. :)

   
 
 автор: Drago   (04.01.2008 в 11:21)   письмо автору
 
   для: sim5   (04.01.2008 в 09:58)
 

В кино, компьютерных играх, литературе спойлер — преждевременно раскрытая важная информация, которая портит впечатление от игры/книги/фильма и разрушает их интригу; реже — лицо, которое эту информацию преждевременно раскрыло. Классический пример спойлера, вошедший в анекдоты — имя убийцы в детективе («убийца — садовник»).

http://ru.wikipedia.org/wiki/Спойлер

   
 
 автор: devil943   (04.01.2008 в 14:04)   письмо автору
 
   для: Trianon   (04.01.2008 в 09:48)
 

Народ :) Харе флудить. Лучше помогите мне. Да, спойлер в данном случае никаким боком не относится к машинам, задним дверям и тд.
Вот тут пример:
http://o-rpg.com/forum/index.php?type=forum&id_forum=2&id_theme=3

   
 
 автор: Trianon   (04.01.2008 в 15:45)   письмо автору
 
   для: devil943   (04.01.2008 в 14:04)
 

Наверное в цитатах имеет смысл вставлять не сообщение целиком, а лишь текстовую его часть.
Если хочется цитировать контент целиком, придется формировать длинные путевые идентификаторы
$spoil_id = $parent_parent_msg_id.$parent_msg_id.$this_msg_id

   
 
 автор: devil943   (04.01.2008 в 17:21)   письмо автору
 
   для: Trianon   (04.01.2008 в 15:45)
 

Спойлер это не цитата.

Суть в том, что id ИМХо все равно окажется таким же...

   
 
 автор: Trianon   (04.01.2008 в 17:49)   письмо автору
 
   для: devil943   (04.01.2008 в 17:21)
 

Идентификатор сущности является уникальным в своем пространстве по определению.
Так что никаких таких же быть не должно.
Добавляя несколько спойлеров к тексту реплики их идентификаторы можно формировать как msgid-spoilSeqNo

Знаете, я подожду, пока Вы определите, что такое спойлер.
А то получается разговор ни о чем.

   
 
 автор: sim5   (04.01.2008 в 18:00)   письмо автору
 
   для: devil943   (04.01.2008 в 14:04)
 

У вас проблема в JS коде, мне кажется. Даже если у вас и будут разные id слои иметь, то проблема скорее всего останется, можете просто "ручником" создать несколько вложенных слоев с разными id, и на отдельной HTML страничке проверить это.

   
 
 автор: devil943   (04.01.2008 в 22:52)   письмо автору
 
   для: sim5   (04.01.2008 в 18:00)
 

Вот код js

function open_close(id) {
    var sp = document.getElementById('sp_'+id);
    var sp_close = document.getElementById('sp_close_'+id);
    var sp_open = document.getElementById('sp_open_'+id);
    if (!sp) return false;
    if (!sp_close) return false;
    if (!sp_open) return false;
    sp.style.display = (sp.style.display=="block") ? "none" : "block";
    sp_close.style.display = (sp_close.style.display=="block") ? "none" : "block";
    sp_open.style.display = (sp_open.style.display=="none") ? "block" : "none";

}

   
 
 автор: devil943   (04.01.2008 в 22:52)   письмо автору
 
   для: sim5   (04.01.2008 в 18:00)
 

Вот пример того, что должн получиться:

<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
</div><div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">
<div id="sp_open_2" style="display:block">
<a href="javascript:open_close(2)">Показать спойлер</a></div><div id="sp_close_2" style="display:none">
<a href="javascript:open_close(2)">Скрыть спойлер</a></div><div id="sp_2" class="spoiler" style="display:none">открой дальше</div></div></div></div></div></div></div></div></div></div></div>
</div></div></div></div></div></div></div>


Как вы видите везде одинаковый id

Вот код js

function open_close(id) {
    var sp = document.getElementById('sp_'+id);
    var sp_close = document.getElementById('sp_close_'+id);
    var sp_open = document.getElementById('sp_open_'+id);
    if (!sp) return false;
    if (!sp_close) return false;
    if (!sp_open) return false;
    sp.style.display = (sp.style.display=="block") ? "none" : "block";
    sp_close.style.display = (sp_close.style.display=="block") ? "none" : "block";
    sp_open.style.display = (sp_open.style.display=="none") ? "block" : "none";

}

   
 
 автор: Trianon   (05.01.2008 в 01:17)   письмо автору
 
   для: devil943   (04.01.2008 в 22:52)
 

Откуда переменная $spoiler берет свое значение, Вы так и не указали.
А ведь это и есть id

   
 
 автор: devil943   (05.01.2008 в 14:11)   письмо автору
 
   для: Trianon   (05.01.2008 в 01:17)
 

Он указывается в index.php прямо перед инклудом фалйика, котрый собвственно и заменяет bb коды на html

   
 
 автор: sim5   (05.01.2008 в 03:26)   письмо автору
 
   для: devil943   (04.01.2008 в 22:52)
 

Про одинаковый ID вам сказали уже. А вы пробовали просто руками прописать эти всем слоям (те что вы привели выше) разный ID, и поместив это на отдельную страницу вместе с JS кодом, пощелкать свои "спойлеры"?

   
 
 автор: devil943   (05.01.2008 в 14:15)   письмо автору
 
   для: sim5   (05.01.2008 в 03:26)
 

Просто руками? Я не понимаю. Приходит пользователь и пишет сообщение, после чего я лезу в базу данных и ставлю idшник? Бред...

Я думал на тем, что бы стразу ставить id? Когда юзер ставит спойлер, но что мешает ему поменять id?... Мало ли какое заполдо могут устроить?

   
 
 автор: sim5   (05.01.2008 в 14:28)   письмо автору
 
   для: devil943   (05.01.2008 в 14:15)
 

Это не для пользователя, а для вас. Пропишите несколько слоев (так как вам надо) с нужными ID и проверьте свое творение - сомневаюсь что даже в этом случае оно у вас будет работать.

   
 
 автор: devil943   (05.01.2008 в 14:46)   письмо автору
 
   для: sim5   (05.01.2008 в 14:28)
 

А, вы про это. Я пробовал, все раюботает, даже ошибок не выдает ) что с моим знанием js странно

   
 
 автор: sim5   (05.01.2008 в 14:55)   письмо автору
 
   для: devil943   (05.01.2008 в 14:46)
 

Ну тогда в цикле (или что у вас формирует id) правильно передайте номер в идентификаторы.

   
 
 автор: devil943   (05.01.2008 в 15:01)   письмо автору
 
   для: sim5   (05.01.2008 в 14:55)
 

да вы понимаете в чем дело: цикл только перебирает сообщение, а в самом сообщении цикла нет, что бы id другой подставить. Имено этого решения я и жду! (

   
 
 автор: sim5   (05.01.2008 в 15:23)   письмо автору
 
   для: devil943   (05.01.2008 в 15:01)
 

Если у вас цикл перебирает сообщения, то уже есть цикл. Что тудно "прикрутить" итерацию этого цикла к ID слоев?

   
 
 автор: devil943   (05.01.2008 в 19:23)   письмо автору
 
   для: sim5   (05.01.2008 в 15:23)
 

Так в сообщении может быть несколько спойлеров, надо чтобы каждый спойлер перебирался циклом.

   
 
 автор: sim5   (06.01.2008 в 00:33)   письмо автору
 
   для: devil943   (05.01.2008 в 19:23)
 

Вложение цыклов никто не запрещал.

   
 
 автор: devil943   (06.01.2008 в 02:14)   письмо автору
 
   для: sim5   (06.01.2008 в 00:33)
 

Но вы же видите, как обрабатываются сообщения?
Я не очень представляю себе такой скрипт..
Т.е в начале он долже находить запись вида [spoiler] и заменять ее на [spoiler id=$num]
Так? Но как организовать такой пебор?

   
 
 автор: sim5   (06.01.2008 в 02:30)   письмо автору
 
   для: devil943   (06.01.2008 в 02:14)
 

Понятия не имею как у вас должны выводиться и от куда берутся, но определить внешнюю по отношению к циклу переменную можно, а далее в цикле/циклах делайте с нею что хотите, согласно вашим замыслам, ее значение и подставляйте.

   
 
 автор: devil943   (06.01.2008 в 12:50)   письмо автору
 
   для: sim5   (06.01.2008 в 02:30)
 

Еще раз говорю: в одном сообщении может быть несколько скойлеров.

   
 
 автор: devil943   (07.01.2008 в 12:20)   письмо автору
 
   для: sim5   (06.01.2008 в 02:30)
 

Господитн хороший. я не понял, что вы имели в виду. Не могли бы вы пояснить это кодом?

   
 
 автор: Trianon   (07.01.2008 в 12:28)   письмо автору
 
   для: devil943   (07.01.2008 в 12:20)
 

У Вас на странице имеются сообщения. Не одно, а несколько. А значит код сообщений строит некоторый цикл.
Далее. В каждом сообщении (по Вашим словам) может быть несколько спойлеров.
Соответственно и их код тоже образуется циклом. Поскольку Вы применяете preg_replace, то цикл может быть и неявным - внутри этой функции.
Если это действительно так, то preg_replace имеет смысл заменить на preg_replace_callback, и вынести генерацию окончательного id в callback-обработчик.

   
 
 автор: devil943   (08.01.2008 в 13:18)   письмо автору
 
   для: Trianon   (07.01.2008 в 12:28)
 

>preg_replace_callback
Можно по-подробнее? Я такой функции не знаю и в книжке не видел. Вы не моглибы написать мини-листинг?

   
 
 автор: devil943   (08.01.2008 в 14:11)   письмо автору
 
   для: Trianon   (07.01.2008 в 12:28)
 

А вы не могли бы сразу написать, как будет выглядеть замена с циклом?

   
 
 автор: Trianon   (08.01.2008 в 15:20)   письмо автору
 
   для: devil943   (08.01.2008 в 14:11)
 

Не зная шаблона замены?
Не зная, какой вид имеет этот самый $spoiler?


preg_replace_callback()

   
 
 автор: sim5   (07.01.2008 в 12:47)   письмо автору
 
   для: devil943   (07.01.2008 в 12:20)
 

А если я "господин плохой"?))
Вы точно уверены, что ваш JS код работать будет?

   
 
 автор: devil943   (08.01.2008 в 13:19)   письмо автору
 
   для: sim5   (07.01.2008 в 12:47)
 

Ну плохой, так плохой... да, все работает прекрасно, я же кинул код, есливы не верите, проверьте.

   
 
 автор: sim5   (08.01.2008 в 13:28)   письмо автору
 
   для: devil943   (08.01.2008 в 13:19)
 

Я проверял. Я не о том, если вы чуть собъетесь во вложенности слоев, все, не будет как положено работать ваш скрипт. Слишком уж много вложений получается. Может быть хотя бы убрать половину - не делать два слоя (Скрыть/Показать) для одного и того же сообщения, а иметь один, так чтобы он Сворачивался/Разворачивался. Вам просто при проходах цикла, нужно не только верно ID вложений определить, но и сами вложения (правильно закрыть слой).

   
 
 автор: devil943   (08.01.2008 в 14:09)   письмо автору
 
   для: sim5   (08.01.2008 в 13:28)
 

Я немного переписал код замены. Теперь поиск идет до первого закрывающегося тега, то есть вложения в кодах запрещены.


$patern = "|\[spoiler\] (.*?) \[/spoiler\]|ixs";    
    $replacment = "<div id=\"sp_open_$spoiler\" style=\"display:block\"><a href=\"javascript:open_close($spoiler)\">Показать спойлер</a></div>";
    $replacment .= "<div id=\"sp_close_$spoiler\" style=\"display:none\"><a href=\"javascript:open_close($spoiler)\">Скрыть спойлер</a></div>";
    $replacment .= "<div id=\"sp_$spoiler\" class=\"spoiler\" style=\"display:none\">$1</div>";
    $spoiler=$spoiler+1;
    $text = preg_replace($patern, $replacment, $text);

   
 
 автор: RazoR Empire   (08.01.2008 в 16:16)   письмо автору
 
   для: devil943   (08.01.2008 в 14:09)
 

во-первых где у тебя $spoiler определён?
во-вторых, вместо

 $spoiler=$spoiler+1;

надо

 $spoiler++;

в третьих в регулярках вместо $spoiler пиши ".$spoiler."
так быстрее будет

   
 
 автор: devil943   (08.01.2008 в 17:22)   письмо автору
 
   для: RazoR Empire   (08.01.2008 в 16:16)
 

В общем пытаюсь что-то сделать другими методами..


$order = PREG_PATTERN_ORDER;
    preg_match_all("/\[spoiler\] (.*?) \[\/spoiler\]/ixs", $text, $found, $order);
    print_r($found);
    for($j=0; $j<=count($found); $j++) {
        $patern = "/\[spoiler\] (.*?) \[\/spoiler\]/ixs";    
        $replacment = "<div id=\"sp_open_$j\" style=\"display:block\"><a href=\"javascript:open_close($j)\">Показать спойлер</a></div>";
        $replacment .= "<div id=\"sp_close_$j\" style=\"display:none\"><a href=\"javascript:open_close($j)\">Скрыть спойлер</a></div>";
        $replacment .= "<div id=\"sp_$j\" class=\"spoiler\" style=\"display:none\">$1</div>";
        $text_f[$j] = preg_replace($patern, $replacment, $found[0][$j]);
        
        $patern = "/$found\[$j\]/";
        $replacment = "$text_f[$j]";
        $text = preg_replace($patern, $replacment, $text);
    }

   
 
 автор: devil943   (08.01.2008 в 18:19)   письмо автору
 
   для: devil943   (08.01.2008 в 17:22)
 

Все, окончательный вид...


// Spoiler
    $order = PREG_PATTERN_ORDER;
    preg_match_all("/\[spoiler\] (.*?) \[\/spoiler\]/ixs", $text, $found, $order);
    for($j=0; $j<count($found[0]); $j++) {
        $patern = "/\[spoiler\] (.*?) \[\/spoiler\]/ixs";
        $id_sp = $j+$post[id_post];    
        $replacment = "<div id=\"sp_open_$id_sp\" style=\"display:block\"><a href=\"javascript:open_close($id_sp)\">Показать спойлер</a></div>";
        $replacment .= "<div id=\"sp_close_$id_sp\" style=\"display:none\"><a href=\"javascript:open_close($id_sp)\">Скрыть спойлер</a></div>";
        $replacment .= "<div id=\"sp_$id_sp\" class=\"spoiler\" style=\"display:none\">$1</div>";
        $text_f[$j] = preg_replace($patern, $replacment, $found[0][$j]);
        
        $patern = "/".$found[0][$j]."/ixs";
        $replacment = "$text_f[$j]";
        $text = preg_replace($patern, $replacment, $text);
    }

Теперь вопрос в студию:
В строке
$patern = "/".$found[0][$j]."/ixs";
$found[0][$j] может содержать символы типа [ ] . / \ и тд, которые рассматриваются как служебные символы. Как этого избежать?

   
 
 автор: devil943   (09.01.2008 в 16:43)   письмо автору
 
   для: devil943   (08.01.2008 в 18:19)
 

Мне никто не поможет?

   
 
 автор: kasmanaft   (11.01.2008 в 11:55)   письмо автору
 
   для: devil943   (04.01.2008 в 01:16)
 

>>В строке $patern = "/".$found[0][$j]."/ixs";
>>$found[0][$j] может содержать символы типа [ ] . / \ и тд, которые
>>рассматриваются как служебные символы. Как этого избежать?
Для этого можно использовать функцию preg_quote(). Но это вряд ли спасёт....
Выражения /\[spoiler\] (.*?) \[\/spoiler\]/ не подойдут для вложенных [spoiler].

Trianon вам говорил про preg_replace_callback().. Всё гораздо проще:

<script>
function open_close(id) { 
    var sp = document.getElementById('sp_'+id); 
    var sp_close = document.getElementById('sp_close_'+id); 
    var sp_open = document.getElementById('sp_open_'+id); 
    if (!sp) return false; 
    if (!sp_close) return false; 
    if (!sp_open) return false; 
    sp.style.display = (sp.style.display=="block") ? "none" : "block"; 
    sp_close.style.display = (sp_close.style.display=="block") ? "none" : "block"; 
    sp_open.style.display = (sp_open.style.display=="none") ? "block" : "none"; 
}
</script>

<?php
$text 
"[spoiler]1[spoiler]2[/spoiler][/spoiler]text[spoiler]3[spoiler]4[/spoiler][/spoiler]";

function 
repl($arr) {
  static 
$id 0;
  
$replacement 
'<div id="sp_open_'.$id.'" style="display:block"><a href="javascript:open_close('.$id.')">Показать спойлер</a></div>
<div id="sp_close_'
.$id.'" style="display:none"><a href="javascript:open_close('.$id.')">Скрыть спойлер</a></div>
<div id="sp_'
.$id.'" class="spoiler" style="display:none">'."\r\n";
  
$id++;
  return 
$replacement;
}

$text preg_replace_callback("#\[spoiler\]#""repl"$text);
echo 
$text str_replace("[/spoiler]""</div>"$text);
?>

   
 
 автор: devil943   (11.01.2008 в 16:22)   письмо автору
 
   для: kasmanaft   (11.01.2008 в 11:55)
 

ммм.. вы меня еще раз спасли :) Спасибо еще раз!

Единственное, что не понятно:

function repl($arr) { 
- функция от какого-то $arr
А вот тут, как я понимаю, мы ее вызываем:
$text = preg_replace_callback("#\[spoiler\]#", "repl", $text); 

Но почему вызываем только repl без ($arr) ?

И еще у меня вылезает вот такая ошибка:

Fatal error: Cannot redeclare repl($arr) (previously declared in /home/host4571/www/forum/preg_replace3.inc:28) in /home/host4571/www/forum/preg_replace3.inc on line 27


Строка 27:
    function repl($arr) { 

   
 
 автор: kasmanaft   (11.01.2008 в 18:27)   письмо автору
 
   для: devil943   (11.01.2008 в 16:22)
 

>> Но почему вызываем только repl без ($arr) ?
Такой синтаксис... В callback функцию автоматически передается массив найденных вхождений (такой же массив, что был бы получен с помощью preg_match()).

>> И еще у меня вылезает вот такая ошибка...
Говорит, что уже есть функция с таким именем. Только почему-то она на следующей строке объявлена. Странно... Попробуйте обозвать по-другому функцию или используйте create_function() на примере http://php.net/preg_replace_callback

   
 
 автор: devil943   (11.01.2008 в 19:15)   письмо автору
 
   для: kasmanaft   (11.01.2008 в 18:27)
 

Я переименовал, но происходит также фигня. Файл вызывается include может из-за этого?

Потом в этом примере переменеая, от которой работает функция что-то в себе несет, а тут она не имеет значения (тоже убрал).

А create_function() - используется если она ничего не делает, как я понял.

   
 
 автор: kasmanaft   (11.01.2008 в 19:55)   письмо автору
 
   для: devil943   (11.01.2008 в 19:15)
 

> Я переименовал, но происходит также фигня
Поищите поиском по всем файлам "repl"... Или может быть сервер перегрузить попробовать? глюк мож какой..

> Потом в этом примере переменеая, от которой работает функция что-то в себе несет, а тут она не имеет значения (тоже убрал).
Не понял %)

> А create_function() - используется если она ничего не делает, как я понял.
Кто ничего не делает? :) Она используется, если callback функция нигде больше не используется... Потому что функцию, созданную с помощью create_function() больше нигде использовать не получится.

Попробуйте вот так:

$func = 'static $id = 0; 
$replacement = \'<div id="sp_open_\'.$id.\'" style="display:block"><a href="javascript:open_close(\'.$id.\')">Показать спойлер</a></div> 
<div id="sp_close_\'.$id.\'" style="display:none"><a href="javascript:open_close(\'.$id.\')">Скрыть спойлер</a></div> 
<div id="sp_\'.$id.\'" class="spoiler" style="display:none">\'."\r\n"; 
$id++; 
return $replacement;';

$text = preg_replace_callback("#\[spoiler\]#", create_function('$arr', $func), $text); 
echo $text = str_replace("[/spoiler]", "</div>", $text); 

   
 
 автор: devil943   (11.01.2008 в 20:12)   письмо автору
 
   для: kasmanaft   (11.01.2008 в 19:55)
 

так, тперь ошибок не выдает. Но для каждого поста идентификаторы одинаковы. То есть пост №1, в нем 2 спойлера, тогда у первого будет идентификатор 0, а дял второго - 1
В посте №2 отсчет идентификаторов начинается снова с нуля.

Поэтому я решил сделать, что бы идентификатор начинался не с нуля, а с id поста (у меня это $post[id_post] в цикле).
я написал
$func = 'static $id = $post[id_post];

После чего полетели ошибки
Parse error: syntax error, unexpected T_VARIABLE in /home/host4571/www/forum/preg_replace3.inc(35) : runtime-created function on line 1

Warning: preg_replace_callback() requires argument 2, '', to be a valid callback in /home/host4571/www/forum/preg_replace3.inc on line 35

я решил вывести $post[id_post], что бы проверить, может он NULL? Вывел его перед начало присваивания $func
echo $post[id_post];
Все прекрасно вывелось, но ошибка сохраницась.

   
 
 автор: kasmanaft   (11.01.2008 в 20:21)   письмо автору
 
   для: devil943   (11.01.2008 в 20:12)
 

$post[id_post] "не видно" из созданной функции...
Сделайте вот так: 'static $id = '.$post["id_post"].';

PS я говорил, "созданную с помощью create_function() больше нигде использовать не получится" - вообще-то получится, если какой-нибудь переменной присвоить значение, возвращаемое create_function(). Но в таком случае функцию лучше описать как обычно.

   
 
 автор: devil943   (11.01.2008 в 20:38)   письмо автору
 
   для: kasmanaft   (11.01.2008 в 20:21)
 

Готово! Да уже, сделать этот id уникальныйм оказалось не просто :)
О как: $modif_id = $post["id_post"]*$post[user_num] + $num_post;
Вроде пока уникальность сохранилась :)

   
Rambler's Top100
вверх

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