PHP

Автоматическое оглавление для статьи

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

Решение: регулярным выражением вытащить из текста все <h2>, дописать к ним якоря и вывести список ссылок.

Самое главное чтобы в тексте не было одинаковых заголовков <h2>.

1

Сбор заголовков

$text = '
    <h2>Заголовок 1</h2>
    <p>...</p>
    <h2>Заголовок 2</h2>
    <p>...</p>
    <h2>Заголовок 3</h2>
    <p>...</p>
    <h2>Заголовок 4</h2>
    <p>...</p>
';

$text = stripslashes($text);
preg_match_all("/<h2.*?>(.*?)<\/h2>/i", $text, $items);
print_r($items);

В некоторых CMS нет возможности получить текст в переменной – поможет буферизация вывода:

od_start();
$text = ob_get_clean();

Получим массив, в котором $items[0] будет содержать теги, $items[1] только тексты.

Array(
    [0] => Array(
        [0] => <h2>Заголовок 1</h2>
        [1] => <h2>Заголовок 2</h2>
        [2] => <h2>Заголовок 3</h2>
        [3] => <h2>Заголовок 4</h2>
    )
    [1] => Array(
        [0] => Заголовок 1
        [1] => Заголовок 2
        [2] => Заголовок 3
        [3] => Заголовок 4
    )
)
2

Формирование якорного меню

<div class="texts-list">
    <h3>Содержание</h3>
    <ol>
        <?php
        foreach ($items[1] as $i => $row) {
            echo '<li><a href="#tag-' . ++$i . '">' . $row . '</a></li>';
        }
        ?>                    
    </ol>
</div>
3

Вставка якорей и вывод текста

foreach ($items[0] as $i => $row) {
    $text = str_replace($row, '<a name="tag-' . ++$i . '"></a>' . $row, $text);
}        

echo $text;
4

Результат работы скрипта

5

Код целиком

<?php
$text = '
    <h2>Заголовок 1</h2>
    <p>...</p>
    <h2>Заголовок 2</h2>
    <p>...</p>
    <h2>Заголовок 3</h2>
    <p>...</p>
    <h2>Заголовок 4</h2>
    <p>...</p>
';

$text = stripslashes($text);
preg_match_all("/<h2.*?>(.*?)<\/h2>/i", $text, $items);

if (!empty($items[1])) {
    ?>
    <div class="texts-list">
        <h3>Содержание</h3>
        <ol>
            <?php
            foreach ($items[1] as $i => $row) {
                echo '<li><a href="#tag-' . ++$i . '">' . $row . '</a></li>';
            }
            ?>                    
        </ol>
    </div>
    <?php    
}

if (!empty($items[0])) {
    foreach ($items[0] as $i => $row) {
        $text = str_replace($row, '<a name="tag-' . ++$i . '"></a>' . $row, $text);
    } 
}

echo $text;
05 марта 2019
В последнее время письма отправляемые с хостингов через функции mail() и mb_send_mail() часто попадают в спам или...
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS....
В статье приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и...
Библиотека GD дает возможность работать с изображениями в PHP. Далее представлены примеры как изменить размер, вырезать...