Не удалось уценить функцию парсера в php с помощью регулярных выражений - PullRequest
0 голосов
/ 18 февраля 2020

Давайте напишем простую функцию синтаксического анализатора уценки, которая будет брать в одной строке уценки и переводить в соответствующую HTML. Для простоты мы будем поддерживать только одну функцию разметки в синтаксисе atx: заголовки.

Заголовки обозначаются (1-6) хэшами, за которыми следует пробел, за которым следует текст. Количество хэшей определяет уровень заголовка вывода HTML.

Примеры

# Header will become <h1>Header</h1>
## Header will become <h2>Header</h2>
###### Header will become <h6>Header</h6>

Мой код:

function markdown_parser ($markdown) {
$regex = '/(?:(#+)(.+?)\n)|(?:(.+?)\n\s*=+\s*\n)/';
$headerText = $markdown."\n";
$headerText = preg_replace_callback(
    $regex,
    function($matches){
        if (!preg_match('/\s/',$matches[2])) {
            return "#".$matches[2];
        }
        if($matches[1] != ""){
           $h_num = strlen($matches[1]);
           return html_entity_decode("<h$h_num>".trim($matches[2])."</h$h_num>");
        }  
    },
    $headerText
);
return $headerText;
}

он не работает как неудачный тестовый пример :

Failed asserting that two strings are identical.
Expected: Behind # The Scenes
Actual  : Behind <h1>The Scenes</h1>

1 Ответ

0 голосов
/ 18 февраля 2020

Что я понял, так это то, что вы хотите ограничить конверсию уценки диапазоном глубины 1-6 для вашего заголовка.

Попробуйте этот код:

function markdown_parser ($markdown) {
    $regex = '/(?:(#+)(.+?)\n)|(?:(.+?)\n\s*=+\s*\n)/';
    $headerText = $markdown."\n";
    $headerText = preg_replace_callback(
        $regex,
        function($matches) use ($markdown){
            if (!preg_match('/\s/',$matches[2])) {
                return "#".$matches[2];
            }
            if($matches[1] != ""){
                $h_num = strlen($matches[1]);
                if (\in_array($h_num, \range(1, 6), true)) {
                    return html_entity_decode("<h$h_num>" . trim($matches[2]) . "</h$h_num>");
                }

                return $markdown;
            }
        },
        $headerText
    );
    return $headerText;
}

Я только добавьте условие, чтобы проверить, находится ли число хештегов в диапазоне от 1 до 6 if (\in_array($h_num, \range(1, 6), true)) {

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...