试图在PHP所见即所得中模仿Markdown的块引用功能



我正在从头开始构建所见即所得,作为一项学术练习,但我遇到了一个障碍。我试图使用一些基本的Markdown方法构建所见即所得,比如用星号表示粗体/斜体,用haskmark表示标题等。然而,我遇到了块引号的问题。以下是我目前用于处理区块报价输入的代码:

$content = '$_POST['content'];
while (preg_match('^>s(.*)$', $content)) {
    $content    =   preg_replace('^>s(.*)$', '<blockquote>$1</blockquote>', $content);
};

基本上,它会查找以"大于"符号开头的任何一行,提取文本并将其放在块引号标记中,如下所示:

input:
> this is a blockquote.
output:
<blockquote>this is a blockquote.</blockquote>

这很好,但Markdown也可以将多行块引号转换为单个块引号。例如:

input:
> this is a blockquote that
> i decided to separate across
> several lines.
output:
<blockquote>this is a blockquote that i decided to separate across several lines.</blockquote>

我想模仿这个功能,但用我目前的代码,我最终会得到这个:

output:
<blockquote>this is a blockquote that</blockquote><blockquote>i decided to separate across</blockquote><blockquote>several lines.</blockquote>

我只是不知道如何正确地连接块引号。我想到的一种方法是更改每一行,然后对</blockquote><blockquote>进行新的搜索,其间没有双线中断,但这似乎效率很低。代码将变为:

$content = '$_POST['content'];
while (preg_match('^>s(.*)$', $content)) {
    $matched = true;
    $content = preg_replace('^>s(.*)$', '<blockquote>$1</blockquote>', $content);
};
if ($matched) {
    $content = preg_replace('</blockquote>(n|r)?<blockquote>', '', $content);
};

我想这会起作用,但我觉得有一种更好的方法可以利用正则表达式进行前瞻并获取所有额外的行。不幸的是,我不知道那会是什么。

用您想要的任何标签替换<p>:)

<?php
$text = '
line one
line 2
> blockquote blockquote blockquote blockquote blockquote
> blockquote blockquote blockquote blockquote blockquote
> blockquote blockquote blockquote.
line 3
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
any
';
function blockquota($matches){
 $mytext = str_replace(array("> ", ">"), '' , $matches[0]);
 $mytext = '<p>'.$mytext.'</p>';
 return $mytext;
}
$pattern = '/(>)([^v]+)(v*((>)([^v]+)))*/';
echo htmlspecialchars(preg_replace_callback($pattern, 'blockquota', $text));
?>

输出:

line one
line 2
<p>blockquote blockquote blockquote blockquote blockquote
blockquote blockquote blockquote blockquote blockquote
blockquote blockquote blockquote.</p>
line 3
<p>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA</p>
any

最新更新