1

アカデミックな演習としてWYSIWYGをゼロから構築しているところ、問題が発生しました。太字/斜体のアスタリスク、見出しのハスクマークなど、いくつかの基本的なMarkdownメソッドを使用して動作するように、WYSIWYGを構築しようとしています。しかし、ブロッククォートに問題が発生しました。ブロッククォートの入力を処理するために現在使用しているコードは次のとおりです。

$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>

ブロッククォートを適切に連結する方法がわかりません。私が考えたアプローチの1つは、各行を変更してから、</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);
};

それでうまくいくと思いますが、正規表現を利用して先読みし、余分な行をすべて取得するより良い方法があるように感じます。残念ながら、それがどうなるかについてはわかりません。

4

1 に答える 1

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
于 2013-02-21T18:03:09.703 に答える