| 
| ВНИМАНИЕ! Наша конференция посвящена космической тематике и компьютерным играм.
 Политические вопросы и происходящие в мире события в данный момент на нашем сайте не обсуждаются!
 
 
 |  | » Вопрос по 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 
  1470 EGP 
       Рейтинг канала: 8(759)
 Репутация: 261
 Сообщения: 4790
 Откуда: Питербурх
 Зарегистрирован: 06.01.2003
 
    |  | 
	  | Non : |  
	  | $Regex = "#{spoiler=(.+?)}(.+?){/spoiler}#s"; |  Я в пыхпыховых регекспах не шибко молодец, но разве в них фигурные скобочки искейпить не надо?
 _________________
 Классическая ошибка, которую совершают проектировщики абсолютно надежных систем, – недооценка изобретательности клинических идиотов.
 |  
		|  |  |  |  
		| AnrDaemon 
  866 EGP 
         Рейтинг канала: 8(805)
 Репутация: 37
 Сообщения: 12336
 
 Зарегистрирован: 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)» |  
		|  |  
        | К списку каналов | Наверх страницы |  | Цитата не в тему:  А мне очень нравится группа "Модератор" с композицией "Тема закрывается". (Squad о музыкальных пристрастиях) 
 
 |  | » Вопрос по PHP (в основном preg) | страница 1 |  |