Elite Games - Свобода среди звезд!
.
ВНИМАНИЕ!
Наша конференция посвящена космической тематике и компьютерным играм.
Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!

  » Вопрос по 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(), строка, вся помещенная в переменную страница или куда.
Если строка, тогда это в корне неправильно и нужно будет страницу раскладывать на строки в массив и парсить их по очереди.

Залип я. Расстроен ООП и я далеки друг от друга.

Буду рад помощи, спасибо за внимание. Улыбка
    Добавлено: 13:11 25-02-2016   
Grebomet
 1460 EGP


Модератор
Рейтинг канала: 8(753)
Репутация: 261
Сообщения: 4765
Откуда: Питербурх
Зарегистрирован: 06.01.2003
Non :
$Regex = "#{spoiler=(.+?)}(.+?){/spoiler}#s";

Я в пыхпыховых регекспах не шибко молодец, но разве в них фигурные скобочки искейпить не надо?
_________________
Классическая ошибка, которую совершают проектировщики абсолютно надежных систем, – недооценка изобретательности клинических идиотов.
    Добавлено: 16:15 25-02-2016   
AnrDaemon
 856 EGP


Модератор
Рейтинг канала: 8(784)
Репутация: 37
Сообщения: 12292

Зарегистрирован: 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 раз
    Добавлено: 16:30 25-02-2016   
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 раз(а)
    Добавлено: 21:56 25-02-2016   
Железный канал: «Вопрос по PHP (в основном preg)»
 
  
Показать: 
Предыдущая тема | Следующая тема |
К списку каналов | Наверх страницы
Цитата не в тему: Добрый модератор - модератор в оффлайне! (подметил fox68)

  » Вопрос по PHP (в основном preg) | страница 1
Каналы: Новости | Elite | Elite: Dangerous | Freelancer | Star Citizen | X-Tension/X-BTF | X2: The Threat | X3: Reunion | X3: Terran Conflict | X Rebirth | X4: Foundations | EVE Online | Orbiter | Kerbal Space Program | Evochron | VoidExpanse | Космические Миры | Онлайновые игры | Другие игры | Цифровая дистрибуция | play.elite-games.ru | ЗВ 2: Гражданская война | Творчество | Железо | Игра Мечты | Сайт
   Дизайн Elite Games V5 beta.18