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

Форум PHP

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Идентификатор спойлера

Сообщения:  [1-10]    [11-20]   [21-30]   [31-40]  [41-46] 

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

Готово! Да уже, сделать этот id уникальныйм оказалось не просто :)
О как: $modif_id = $post["id_post"]*$post[user_num] + $num_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: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 в 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 в 19:15)   письмо автору
 
   для: kasmanaft   (11.01.2008 в 18:27)
 

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

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

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

   
 
 автор: 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 в 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 в 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   (09.01.2008 в 16:43)   письмо автору
 
   для: devil943   (08.01.2008 в 18:19)
 

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

   
 
 автор: 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] может содержать символы типа [ ] . / \ и тд, которые рассматриваются как служебные символы. Как этого избежать?

   

Сообщения:  [1-10]    [11-20]   [21-30]   [31-40]  [41-46] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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