|
|
|
|
|
для: kasmanaft
(11.01.2008 в 20:21)
| | Готово! Да уже, сделать этот id уникальныйм оказалось не просто :)
О как: $modif_id = $post["id_post"]*$post[user_num] + $num_post;
Вроде пока уникальность сохранилась :) | |
|
|
|
|
|
|
|
для: devil943
(11.01.2008 в 20:12)
| | $post[id_post] "не видно" из созданной функции...
Сделайте вот так: 'static $id = '.$post["id_post"].';
PS я говорил, "созданную с помощью create_function() больше нигде использовать не получится" - вообще-то получится, если какой-нибудь переменной присвоить значение, возвращаемое create_function(). Но в таком случае функцию лучше описать как обычно. | |
|
|
|
|
|
|
|
для: 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];
Все прекрасно вывелось, но ошибка сохраницась. | |
|
|
|
|
|
|
|
для: 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);
|
| |
|
|
|
|
|
|
|
для: kasmanaft
(11.01.2008 в 18:27)
| | Я переименовал, но происходит также фигня. Файл вызывается include может из-за этого?
Потом в этом примере переменеая, от которой работает функция что-то в себе несет, а тут она не имеет значения (тоже убрал).
А create_function() - используется если она ничего не делает, как я понял. | |
|
|
|
|
|
|
|
для: devil943
(11.01.2008 в 16:22)
| | >> Но почему вызываем только repl без ($arr) ?
Такой синтаксис... В callback функцию автоматически передается массив найденных вхождений (такой же массив, что был бы получен с помощью preg_match()).
>> И еще у меня вылезает вот такая ошибка...
Говорит, что уже есть функция с таким именем. Только почему-то она на следующей строке объявлена. Странно... Попробуйте обозвать по-другому функцию или используйте create_function() на примере http://php.net/preg_replace_callback | |
|
|
|
|
|
|
|
для: kasmanaft
(11.01.2008 в 11:55)
| | ммм.. вы меня еще раз спасли :) Спасибо еще раз!
Единственное, что не понятно:
- функция от какого-то $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:
| |
|
|
|
|
|
|
|
для: 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
(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] может содержать символы типа [ ] . / \ и тд, которые рассматриваются как служебные символы. Как этого избежать? | |
|
|
|
|