Вывод для цикла без пробелов между элементами, избегая CSS - PullRequest
0 голосов
/ 01 июня 2018

У меня есть следующий PHP:

<?php
    $items = array('foo', 'bar', 'baz', 'qux');
?> 

<div>
    <?php foreach ($items as $item): ?>
        <a><?= $item; ?></a>
    <?php endforeach; ?>
</div>

Необработанный вывод такой:

<div>
                <a>foo</a>
                <a>bar</a>
                <a>baz</a>
                <a>qux</a>
        </div>

Это выглядит уродливо и испорчено, но это фактический результат.Это не беспокоит меня, хотя.Проблема в том, что между тегами <a> есть пробел.В браузере я получаю такой результат:

Elements with spaces between them

Обратите внимание, что между элементами есть пространство. Я не хочу этого.


Я знаю, что вы можете использовать font-size, letter-spacing и еще много чего, чтобы избежать этой проблемы, но я не хочу этого делатьтак как проблема в разметке.

Я также попытался закомментировать пробел, как это:

    <div><!--
        <?php foreach ($items as $item): ?>
         --><a><?= $item; ?></a><!--
        <?php endforeach; ?>
 --></div>

, который привел к следующему выводу:

    <div><!--
                 --><a>foo</a><!--
                 --><a>bar</a><!--
                 --><a>baz</a><!--
                 --><a>qux</a><!--
         --></div>

Иследующий результат:

Elements with no space between them

Это мой желаемый результат, да, но эта техника комментирования смешна ... Она также портит подсветку синтаксиса:

Messed up syntax highlighting


Вопрос

Есть ли законный способ удалить пробелы между элементами без использования CSS или лишних комментариев?

Редактировать: Я использую такую ​​простую разметку только для простоты вопроса.Каков наилучший подход к этому, когда у меня много элементов в цикле for, а не только теги <a>, где было бы сложно использовать echo?То есть, где вам нужно , чтобы закрыть PHP и использовать сокращенные <?= ?> теги?

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

Вы можете использовать следующий код,

<div>
    <?php foreach ($items as $item): ?><a><?= $item; ?></a><?php endforeach; ?>
</div>
0 голосов
/ 01 июня 2018

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

<?php ob_start(); ?>

<ul>
    <li>foo </li>
    <li>b ar</li>
    <li> b a z </li>
</ul>

<?= preg_replace("/>(\s+)</", '><', ob_get_clean()) ?>

Выход захватывается и затем передается в preg_replace().Затем регулярное выражение сопоставляет все вхождения пробела только между тегами, IE > и <.Что круто, так это то, что он не удалит пробелы, когда есть текст.Таким образом, вывод сверху превращается в:

<ul><li>foo </li><li>b ar</li><li> b a z </li></ul>

Без пробелов между элементами, но пространство внутри сохраняется.

Неконечно, будет хорошей идеей, когда большая часть контента обрабатывается с помощью регулярных выражений, но все же ... это выглядит довольно элегантным решением.

0 голосов
/ 01 июня 2018

Вы можете использовать любой из приведенного ниже кода, чтобы удалить пробел между тегами привязки

<div>
    <?php foreach ($items as $item){ ?><a><?= $item; ?></a><?php } ?>
</div>

Или

<div>
    <?php foreach ($items as $item): ?><a><?= $item; ?></a><?php endforeach; ?>
</div>

Или

<div>
    <?php 
      foreach ($items as $item){
        echo "<a>$item</a>";
     } ?>
</div>

Проблема была: вы сказали, что php выводит 1 line и your text, но php минимизировал пробелы, включая разрывы строк, до единого пробела, пока он не будет специально обозначен css или как тег pre.

...