В настоящее время я работаю над своей собственной системой заголовков. Поэтому я пытаюсь использовать #_1#
— #_4#
для нумерации в тексте, которая затем должна быть преобразована в заголовки. Поэтому вы пишете текст заголовка между номером и вторым #
, Например:
#_1Testheadline#
#_2second headline under the first one#
#_2another headline under the first one#
#_1second headline (not under the first one)#
станет
1. Testheadline
1.1 second headline under the first one
1.2 another headline under the first one
2. second headline (not under the first one)
Надеюсь, вы понимаете, о чем я.
Итак, первый пример (так с #_1#
в нем) записывается в WYSIWYG-редакторе, так что это обычный HTML-код, который затем сохраняется в переменной в базе данных.
Теперь я хочу получить эту переменную из базы данных и заменить все псевдо-заголовки реальными заголовками (для просмотра), поэтому первый пример станет вторым.
Поэтому мне нужно найти все случаи #_1
, заменить <h1>
продолжай, пока #
и заменить его на </h1>
, То же самое для второго, третьего и четвертого «слоя» заголовков. Если бы я мог это сделать, я бы еще не закончил, потому что теперь заголовки должны иметь свои номера впереди, поэтому я мог бы просто использовать 4 счетчика:
var firstlayercount = 0,
secondlayercount = 0;
var thirdlayercount = 0,
fourthlayercount = 0;
и увеличьте и установите их обратно в 0, в зависимости от того, какой заголовок был найден, так что на самом деле это должно быть проще. Но сложнее вопрос, как найти #_1
в строке замените его и затем перейдите к #
и заменить его тоже? И сделать это несколько раз?
Используйте функцию preg_replace_callback
$str = '#_1Testheadline#
#_2second headline under the first one
#_2another headline under the first one
#_1second headline (not under the first one)';
// Current level
$level = 0;
echo preg_replace_callback('/#?\s*#_(\d)+/',
function($x) use (&$level) {
// Close previous tag if it is
$out = ($level ? "</h{$level}>\n" : '');
// Save current level and open tag
$level = $x[1];
return $out . "<h{$level}>";
},
// Don't forget to close the last tag
$str) . "<h{$level}>";
результат
<h1>Testheadline#</h1>
<h2>second headline under the first one</h2>
<h2>another headline under the first one</h2>
<h1>second headline (not under the first one)<h1>
ОБНОВЛЕНИЕ 1
Вы можете использовать тот же подход для создания упорядоченного списка
$level = 0;
echo preg_replace_callback('/#?\s*#_(\d)+/',
function($x) use (&$level) {
if($x[1] > $level) $out = "\n<ol>\n";
else if ($x[1] < $level) $out = "</li>\n</ol>\n";
else $out = "</li>\n";
$level = $x[1];
return $out . "<li>";
},
$str) . "</li>\n</ol>\n";
результат
<ol>
<li>Testheadline#
<ol>
<li>second headline under the first one</li>
<li>another headline under the first one</li>
</ol>
<li>second headline (not under the first one)</li>
</ol>
ОБНОВЛЕНИЕ 2
Стилизованные списки css
<STYLE>
ol {
list-style: none;
counter-reset: li;
}
li:before {
counter-increment: li;
content: counters(li,".") ". ";
}
</STYLE>
<ol>
<li>Testheadline#
<ol>
<li>second headline under the first one</li>
<li>another headline under the first one</li>
</ol>
<li>second headline (not under the first one)</li>
</ol>
Других решений пока нет …