{strip}: как избежать непреднамеренного удаления пробелов?

#php #smarty #strip

#php #умный #Стриптиз

Вопрос:

 {strip}
<div
     class="x"
>
{/strip}
 

становится

 <divclass="x">
 

И это не то, что кто-то хотел бы.

Итак, вопрос: есть ли какой-либо способ избежать этого? Воображаемые подходы:

  • замените новые строки пробелами, используя параметры или другие интеллектуальные функции
  • добавьте защищенные пространства, которые не удаляются / не обрезаются

В этой теме на их форуме нет решения (кроме — добавьте свой собственный пользовательский тег). Кроме того, пожалуйста, не предлагайте решения на необработанном PHP или любых других языках / фреймворках.

Комментарии:

1. Этого не должно быть.

2.@Tomalak Geret’kal функциональная полоса, а не модификатор 😉

3. Уважаемый @c69, я отредактировал ваш вопрос, поскольку у меня была та же проблема, но «превращение новых строк в пробелы» не пришло мне в голову в качестве поискового запроса. Надеюсь, все в порядке.

Ответ №1:

Вы можете либо использовать подход @dev, захватить ваши данные и запустить их через модификатор strip:

 {capture name="spaces"}
<div
     class="x"
> ... </div>
{/capture}
{$smarty.capture.spaces|strip:" "}
 

или запустите захваченный контент через модификатор regex_replace (по сути, делая то же самое, что и split, но с большими накладными расходами):

 {$smarty.capture.spaces|regex_replace:"#s #":" "}
 

или добавьте новый плагин пользовательского блока под названием trimwhitespace, который использует выходной фильтр trimwhitespace:

 <?php
function smarty_block_trimwhitespace($params, $content, Smarty_Internal_Template $template, amp;$repeat)
{
  require_once SMARTY_PLUGINS_DIR . 'outputfilter.trimwhitespace.php';
  return smarty_outputfilter_trimwhitespace($content, $template->smarty);
}
 

вызовите этот файл block.trimwhitespace.php и поместите его в plugins_dir. используйте его в своем шаблоне:

 {trimwhitespace}
<div
     class="x"
> ... </div>
{/trimwhitespace}
 

Хотя оба подхода с модификаторами будут хорошо работать для простых HTML-файлов, они будут прерываться для содержимого, включая <script> <pre> теги or . Если они вам нужны, вы хотите использовать обернутый outputfilter.

Если вы хотите, чтобы все ваши выходные данные проходили через этот фильтр, забудьте об изменении ваших шаблонов и добавьте $smarty->loadFilter('output', 'trimwhitespace'); их в настройки.

Ответ №2:

Для защиты отдельных пробелов:

 {strip}
<div class="first{" "}
  {"second "}
  third">
{/strip}
 

становится

 <div class="first second third">
 

у меня отлично работает с smarty v3.

Комментарии:

1. Работает также для Smarty v2.

2. Спасибо, вы знаете, можно ли воздержаться от этого в каждом шаблоне, а лучше сверху header.tpl и снизу footer.tpl . Кажется, что теги Smarty не передаются через шаблоны?

Ответ №3:

Присвойте свой код переменной и попробуйте {$articleTitle|strip:'amp;nbsp;'}