试图在PHP WYSIWYG中模仿Markdown的blockquote功能

时间:2013-02-21 17:37:49

标签: php regex markdown

我正在从头开始构建一个WYSIWYG作为学术练习,我遇到了障碍。我正在尝试使用一些基本的Markdown方法构建WYSIWYG,比如使用粗体/斜体的星号,标题的标记等等。但是,我遇到了blockquotes的问题。这是我目前用于处理blockquotes输入的代码:

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

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

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>

我只是不确定如何正确连接blockquotes。我想到的一种方法是更改​​每一行,然后对</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);
};

我认为这样可行,但我觉得有一种更好的方法可以利用正则表达式来预测并抓住所有额外的行。不幸的是,我对这将会是什么一无所知。

1 个答案:

答案 0 :(得分:3)

<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