Найти вхождения строк в строку и заменить

В настоящее время я работаю над своей собственной системой заголовков. Поэтому я пытаюсь использовать #_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 в строке замените его и затем перейдите к # и заменить его тоже? И сделать это несколько раз?

2

Решение

Используйте функцию 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>
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]