Задача: появилась необходимость сделать якорное меню у ранее опубликованных статей, статей много, вручную дополнять их содержанием и расставлять якоря по тексту займут недели...
Решение: регулярным выражением вытащить из текста все <h2>
, дописать к ним якоря и вывести список ссылок.
Самое главное чтобы в тексте не было одинаковых заголовков <h2>
.
$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
)
)
foreach ($items[0] as $i => $row) {
$text = str_replace($row, '<a name="tag-' . ++$i . '"></a>' . $row, $text);
}
echo $text;
<?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;