Чтобы расширить @ CrayonViolent's (в случаях, когда первая замена прерывает вторую):
<?php
$content = "Hello, world
+ Big Heading
++ Smaller heading
Additional content";
function r($m){
$tag = "h".strlen($m[1]);
return "<{$tag}>{$m[2]}</{$tag}>";
}
$content = preg_replace_callback('/^(\+{1,6})\s?(.*)$/m','r', $content);
echo $content;
?>
Также добавлен флаг m
(многострочный) в регулярное выражение для немного лучшего соответствия, и он будет работать только с заголовками <h1>
~ <h6>
.
Рабочий пример может быть расположен здесь