ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм. Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
|
» Вопрос по PHP (в основном preg) | страница 1 |
|
Страница 1 из 1 |
|
|
|
Железный канал: «Вопрос по PHP (в основном preg)» |
|
|
Non 802 EGP
Рейтинг канала: 1(6) Репутация: 239 Сообщения: 801
Зарегистрирован: 27.06.2006 |
|
Приветствую, пилоты!
Хочу сделать плагинчик для Joomla, который будет превращать в тексте статьи
Код: |
{spoiler=title}
text
{/spoiler}
|
В форматирование bootstrap панелей (спойлеров), чтобы обычным людям было просто с ним работать.
Пока понял, что это делается с помощью вклинивания в евент onContentPrepare и последующей корректировкой полученного текста статьи по шаблону с помощью регулярных выражений (как с ними работать я в курсе). Еще видел исходный код плагина emailcloak, который работает со статьями тем же методом. Увидел сколько там кода (по моим скромным меркам) и испугался.
Для теста без Joomla решил сделать так:
Получил в переменную содержимое буфера (т.е. страницу, по которой хочу пройтись regexp'ом).
Код: |
ob_start(); // turn on output buffering
include('main.php');
$mainpage = ob_get_contents(); // get the contents of the output buffer
ob_end_clean(); // clean (erase) the output buffer and turn off output buffering
|
Следующий html шаблон поместил в переменную $SpoilerTemplate таким же образом.
Код: |
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title">
<a class="collapsed h4" href="#spoiler2" data-toggle="collapse" data-parent="#collapse-group">
{SpoilerTitle}
</a>
</div>
</div>
<div style="height: 0px;" id="spoiler2" class="panel-collapse collapse">
<div class="panel-body">
{SpoilerContent}
</div>
</div>
</div>
|
Код: |
$Regex = "#{spoiler=(.+?)}(.+?){/spoiler}#s";
if(preg_match("#{spoiler=.+?}#s", $mainpage->text)){
$mainpage->text = preg_replace($Regex, str_replace(array("{SpoilerTitle}","{SpoilerContent}"),array("$1","$2"),$SpoilerTemplate), $mainpage->text);
} |
Вот это украл подсмотрел в плагине, который делает похожее дело со своим шаблоном, css и прочим (но городить разностильные костыли как-то не захотел).
В общем оно не работает и я вчера за день так и не понял почему.
По моим мыслям оно должно брать содержимое по регулярному выражению $Regex в две переменные - $1 и $2 (т.е. title и content), после чего заменять ВСЮ конструкцию на $SpoilerTemplate (шаблон) с подменой плейсхолдеров {SpoilerTitle} и {SpoilerContent} на значение $1 и $2.
Но тут видимо что-то не так с типом переменных или типа того.
Не понимаю что выдает $variable->text.
(!) К тому же еще надо циклически, используя i=i+1; создавать для каждого следующего спойлера уникальное id.
Т.е. не ясно что должно являться операндом preg(), строка, вся помещенная в переменную страница или куда.
Если строка, тогда это в корне неправильно и нужно будет страницу раскладывать на строки в массив и парсить их по очереди.
Залип я. ООП и я далеки друг от друга.
Буду рад помощи, спасибо за внимание.
|
|
|
Grebomet 1460 EGP
Рейтинг канала: 8(759) Репутация: 261 Сообщения: 4783 Откуда: Питербурх Зарегистрирован: 06.01.2003 |
|
Non : |
$Regex = "#{spoiler=(.+?)}(.+?){/spoiler}#s";
|
Я в пыхпыховых регекспах не шибко молодец, но разве в них фигурные скобочки искейпить не надо?
_________________ Классическая ошибка, которую совершают проектировщики абсолютно надежных систем, – недооценка изобретательности клинических идиотов. |
|
|
AnrDaemon 862 EGP
Рейтинг канала: 8(790) Репутация: 37 Сообщения: 12318
Зарегистрирован: 17.10.2004 |
|
Код: |
<?php
$SpoilerTemplate = <<<'TEMPLATE'
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title">
<a class="collapsed h4" href="#spoiler2" data-toggle="collapse" data-parent="#collapse-group">
$1
</a>
</div>
</div>
<div style="height: 0px;" id="spoiler2" class="panel-collapse collapse">
<div class="panel-body">
$2
</div>
</div>
</div>
TEMPLATE;
$mainpage = <<<'BODY'
<!DOCTYPE html>
<html>
<head><title>!</title></head>
<body>
{spoiler=name1}XXXXXXXXXXXX{/spoiler}
</body>
</html>
BODY;
$buffer = preg_replace('#\{spoiler=([^\}]+)\}(.+?)\{/spoiler\}#m', $SpoilerTemplate, $mainpage);
print $buffer; |
добавлено спустя 42 секунды:
Non : |
(!) К тому же еще надо циклически, используя i=i+1; создавать для каждого следующего спойлера уникальное id.
|
preg_replace_callback()
Grebomet : |
Я в пыхпыховых регекспах не шибко молодец, но разве в них фигурные скобочки искейпить не надо?
|
Надо.
_________________ Люблю свободный полёт... :)
Последний раз редактировалось: AnrDaemon (16:30 25-02-2016), всего редактировалось 1 раз |
|
|
Non 802 EGP
Рейтинг канала: 1(6) Репутация: 239 Сообщения: 801
Зарегистрирован: 27.06.2006 |
|
2AnrDaemon
Сработало, спасибо!
Сгорел я сильно, но удалось получить работающий прототип. По текущим ощущениям он не шибко элегантен. Не знаю как запихнуть id другим способом, но мне кажется какой-то есть.
Немного клешне-индусского копипаста от меня (кликните здесь для просмотра)
Код: |
<?php
ob_start(); // turn on output buffering
include('main.php');
$mainpage = ob_get_contents(); // get the contents of the output buffer
ob_end_clean(); // clean (erase) the output buffer and turn off output buffering
$SpoilerTemplate = <<<'TEMPLATE'
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title">
<a class="collapsed h4" href="#SPOILERID" data-toggle="collapse" data-parent="#collapse-group">
$1
</a>
</div>
</div>
<div style="height: 0px;" id="SPOILERID" class="panel-collapse collapse">
<div class="panel-body">
$2
</div>
</div>
</div>
TEMPLATE;
$id = 0;
$buffer = preg_replace_callback(
'#\{spoiler=([^\}]+)\}(.+?)\{/spoiler\}#m',
function ($matches){
global $SpoilerTemplate;
global $id;
++$id;
$Spoiler = preg_replace('#\{spoiler=([^\}]+)\}(.+?)\{/spoiler\}#m', $SpoilerTemplate, $matches[0]);
$Spoiler = preg_replace('/SPOILERID/', 'spoiler'.$id, $Spoiler);
return $Spoiler;
},
$mainpage);
print $buffer; |
|
Небольшой патчик (кликните здесь для просмотра)
Код: |
<?php
$mainpage = file_get_contents ('./main.php');
$SpoilerTemplate = file_get_contents('./template.php');
$id = 0;
$buffer = preg_replace_callback(
'#\{spoiler=([^\}]+)\}(.+?)\{/spoiler\}#m',
function ($matches){
global $SpoilerTemplate;
global $id;
++$id;
$Spoiler = sprintf($SpoilerTemplate, 'spoiler'.$id, $matches[1], 'spoiler'.$id, $matches[2]);
return $Spoiler;
},
$mainpage);
print $buffer; |
Код: |
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-title">
<a class="collapsed h4" href="#%s" data-toggle="collapse" data-parent="#collapse-group">
%s
</a>
</div>
</div>
<div style="height: 0px;" id="%s" class="panel-collapse collapse">
<div class="panel-body">
%s
</div>
</div>
</div> |
|
Кайф.
Спасибо.
Посоветовали мне заюзать sprintf, что оказалось куда более уместно чем использовать регулярное выражение для текста, найденного с помощью того же регулярного выражения. Сейчас бы начать сильно тупить.
Последний раз редактировалось: Non (22:09 25-02-2016), всего редактировалось 5 раз(а) |
|
|
|
|
|
Железный канал: «Вопрос по PHP (в основном preg)» |
|
|